213 lines
3.5 KiB
Common Lisp
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))
|