2025-03-05 11:50:11 +01:00

213 lines
3.5 KiB
Common Lisp

;;; Kode fra PVVs Lisp-kurs 2012-10-25.
;;; Vi leker litt med REPL-en
245
(+ 6 15)
(+ 3 5 24 72)
(* 3 4)
(- 20 14)
(+ (* 3 4) (- 20 14))
(sqrt 16)
(sqrt 34)
;;; Vi lager nye funksjoner
(defun square (x) (* x x))
;;; En større funksjon
(defun hypothenuse (side1 side2)
(sqrt (+ (square side1) (square side2))))
;;; IF og tester
(defun gjett (tall)
(if (= tall 42)
"riktig"
"galt"))
;;; Eksempel: Fakultet
(defun factorial (n)
(if (= n 0)
1
(* n
(factorial (- n 1)))))
;;; Eksempel: Fibonacci
(defun fib (n)
(if (< n 2)
1
(+ (fib (- n 1))
(fib (- n 2)))))
;;; Lister
(list 1 2 3)
(list 24)
(list (list 3 5 7) (list 2 3))
(list)
;;; Sitering
(+ 4 38)
'(+ 4 38)
pi
'pi
;;; Formatert utskrift
(format t "Svaret er ~A. (Men hva er spørsmålet?)~%"
42)
(format t "Noen objekter: ~A, ~A, ~A.~%"
'(a b c)
50
"foobar")
;;; Lokale variabler: LET
(let ((x 17)
(y 38))
(list x y (+ x y) (* x y)))
;;; Endring av variabler: SETF
(let ((x 3)
(y 5))
(format t "~A = ~A, ~A = ~A~%"
'x x 'y y)
(setf x (+ x y))
(setf y (list 1 2 3))
(format t "~A = ~A, ~A = ~A~%"
'x x 'y y))
;;; Spesielle variabler
(defvar *foo* 42)
(defun print-foo ()
(format t "foo = ~A~%" *foo*))
(defun dostuff ()
(let ((*foo* 0))
(print-foo)
(setf *foo* 5)
(print-foo))
(print-foo))
;;; Mer om SETF
(defvar *the-list* (list 'foo 'bar 'baz))
(setf (first *the-list*) 'flaff)
;;; Vi plukker lister fra hverandre ...
(first '(a b c d))
(rest '(a b c d))
(first (rest '(a b c d)))
(first (rest (rest '(a b c d))))
;;; ... og setter dem sammen igjen
(defvar *list* (list 'a 'b 'c 'd))
(cons (first *list*) (rest *list*))
;;; Den tomme listen: NIL
(cons 'foo nil)
(cons 'foo (cons 'bar nil))
;;; Funksjonen NULL
(null nil)
(null '(a b c))
;;; Eksempel: Sum av en liste med tall
(defun sum (list)
(if (null list) ; Hvis listen er tom
0 ; er dens sum 0,
(+ (first list) ; ellers første tall pluss
(sum ; summen av
(rest list))))) ; resten av listen.
;;; Eksempel: Kvadratene av alle tall i en liste
(defun list-of-squares (numbers)
(if (null numbers)
nil
(cons (square (first numbers))
(list-of-squares (rest numbers)))))
;;; En for-løkke
(loop
for i from 1 to 10
do (format t "~A~%" i))
;;; En while-løkke
(let ((x 1))
(loop
while (> x 0)
do (format t "Square root: ~A~%" (sqrt x))
do (format t "New value:~%")
do (setf x (parse-integer (read-line)))))
;;; En do-while-løkke
(loop
do (format t "Continue?~%")
while (string= (read-line) "yes"))
;;; En foreach-løkke
(loop
for x in '(foo bar baz quux)
do (format t "Element: ~A~%" x))
;;; Kombinasjon av flere typer løkker
(loop
for i from 0
for x in '(foo bar baz quux stop-here moo moo moo)
while (not (eq x 'stop-here))
do (format t "Element ~A: ~A~%" i x))
;;; Oppsamling av verdier
(defun iota (n)
(loop
for i from 0 to n
collect i))
;;; Betingelser
(defun divisors (n)
(loop
for i from 1 to n
if (= (mod n i) 0)
collect i))
;;; Høyereordens funksjoner
(sort (list 5 2 17 8 9 24 12) #'<)
(sort (list 5 2 17 8 9 24 12) #'>)
;;; MAPCAR
(mapcar #'square (list 4 9 32))
;;; REMOVE-IF
(remove-if #'symbolp '(a 5 b 32 c 4))
(mapcar #'square (remove-if #'symbolp '(a 5 b 32 c 4)))
;;; Anonyme funksjoner: LAMBDA
(mapcar (lambda (x) (list x (sqrt x))) (list 16 24 56))