A LISP programozási nyelv

Programok

Gráf bejárása

A program szemlélteti egy gráf bejárását mélységi és szélességi bejárás algoritmusokkal. A gráf tárolása éllisták segítségével történik. Mindkét algoritmus rekurzív formában került implementálásra. Mivel a Lisp fő adatszerkezete a lista, ezért minden adat listák segítségével van tárolva.

;grafot tarolo lista definialasa (setq lista()) ;bejarasi sorrend (setq bejaras(list 1)) ;csucs hozzaadasa a grafhoz (defun graph_addnode(a &rest value) (setq lista(cons (concatenate 'list (list a) value) lista))) ;csucsok bevitele a grafba (graph_addnode 1 2 3 4) (graph_addnode 2 5 6) (graph_addnode 3) (graph_addnode 4 7 8) (graph_addnode 5 9 10) (graph_addnode 6) (graph_addnode 7 11 12) (graph_addnode 8) (graph_addnode 9) (graph_addnode 10) (graph_addnode 11) (graph_addnode 12) ;graf pontok sorrendbe tetele (setq lista(reverse lista)) (setq listaorig lista) ;graf kiiratasa (format t "Gráf: ") (format t "~S~%" lista) ;szelessegi bejaras (defun szelessegi_bejaras(lista bejaras kezdet) (if (= kezdet 1) (progn (format t "~%") (format t "Szélességi bejárás: "))) ;megallasi feltetel (if (not (atom bejaras)) ;minta egyezes vizsgalat a lista fejeleme es a bejarasi sorrend kozott (if (= (car bejaras) (car (car lista))) (progn (format t (concatenate 'string (write-to-string (car bejaras)) " ")) (setq bejaras(append bejaras (cdr (car lista)))) ;ha egyezik a minta es a lista es bejaras sem ures (if (and (not(atom (cdr lista))) (not(atom (cdr bejaras)))) (szelessegi_bejaras (cdr lista) (cdr bejaras) (incf kezdet)) ;ha a bejaras nem ures de a lista mar a vegen van (if (not (atom (cdr bejaras))) (szelessegi_bejaras listaorig (cdr bejaras) (incf kezdet)) ) ) ) ;ha nem egyezett a minta es a lista es bejaras sem uresek (if (and (not(atom (cdr lista))) (not(atom bejaras))) (szelessegi_bejaras (cdr lista) bejaras (incf kezdet)) ;ha a bejaras nem ures de a lista mar a vegen van (if (and (not(atom bejaras)) (atom (cdr lista))) (szelessegi_bejaras listaorig bejaras (incf kezdet)) ) ) ) ) ) ;melysegi bejaras (defun melysegi_bejaras(lista bejaras kezdet) (if (= kezdet 1) (progn (format t "~%") (format t "Mélységi bejárás: "))) ;megallasi feltetel (if (not (atom bejaras)) ;minta egyezes vizsgalat a lista fejeleme es a bejarasi sorrend kozott (if (= (car bejaras) (car (car lista))) (progn (setq bejaras(append (list (car bejaras)) (cdr (car lista)) (cdr bejaras) )) (format t (concatenate 'string (write-to-string (car bejaras)) " ")) ;ha egyezik a minta es a lista es bejaras sem ures (if (and (not(atom (cdr lista))) (not(atom (cdr bejaras)))) (progn (melysegi_bejaras (cdr lista) (cdr bejaras) (incf kezdet)) ) ;ha a bejaras nem ures de a lista mar a vegen van (if (not (atom (cdr bejaras))) (melysegi_bejaras listaorig (cdr bejaras) (incf kezdet)) ) ) ) ;ha nem egyezett a minta es a lista es bejaras sem uresek (if (and (not(atom (cdr lista))) (not(atom bejaras))) (melysegi_bejaras (cdr lista) bejaras (incf kezdet)) ;ha a bejaras nem ures de a lista mar a vegen van (if (and (not(atom bejaras)) (atom (cdr lista))) (melysegi_bejaras listaorig bejaras (incf kezdet)) ) ) ) ) ) (szelessegi_bejaras lista bejaras 1) (melysegi_bejaras lista bejaras 1)

Beolvasás fájlból

Az alábbi példa bemutatja, hogyan lehet sorokat beolvasni egy fájlból.

(setq in) (let ((in (open "/path/teszt" :if-does-not-exist nil))) (when in (loop for line = (read-line in nil) while line do (format t "~a~%" line)) (close in)))

Példa programok

Az alábbi programok Common Lisp alatt íródtak és gcl fordítóval lettek tesztelve.

//lista letrehozasa (list 1 2 "abc") //elem befuzese a lista elejere (cons 1 (list 2 3 4)) //a megadott argumentumokbol listat epit (appends (list 1 2) (list 3 4)) //lista madosik eleme (SECOND (list 1 2 3 4 5)) //list1 letrehozasa (setq list1 (list 1 2 3)) //kozos szakasz list1-el (setq list2 (cons 0 (cdr list1))) //list 2. elemetol az osszes (nthcdr 2 (list 1 2 3 4 5)) //string osszefuzes (concatenate 'string "a" "b") //string to char (coerce "a" 'character) //char to string (string #\c) //4 elemu tomb (make-array 4) //2 dimenzisa tomb (make-array '(2 1)) //1 dimenzios 3 elemu tomb #(1 2 3) //3 elemu tomb (setq tomb (make-array 3)) //tomb elso eleme (aref tomb 1) //tomb elso eleme 3 lesz (setf (aref tomb 1) 3) //tomb 0. eleme 5 lesz (push 5 (aref tomb 0)) //10 elemu bit tomb (make-array 10 :element-type 'bit) //bit tomb #*100000 //bit tomb and (bit-and #*1000 #*1010) //bit tomb xor (bit-xor #*1100 #*1010) //bit tomb not (bit-not #*1111) //aritmetikai fuggveny (+ (* 2 3) (- 10 5)) //sajat double fuggveny (defun double (x) (* x 2)) (double 10) //sajat + fuggveny (defun + (a b &rest c) (* a b (apply '* c)))) (+ 1 2 3 4 5) //if elagazas (if (< 2 3) (print 'true) (print 'false)) //case elagazas (case 'egy ('egy 1) ('ketto 2)) //cond utasitas IF- THEN - ELSE IF (COND ((ATOM '(X Y)) (PRINT "lista")) ((ATOM 4) (PRINT "atom")) (T (print 'TRUE))) //while ciklus (let ((x 1)) (while (< x 4) (print (setq x (* x 2))))) //loop ciklus (loop for x from 2 to 6 by 2 do (print x)) //loop ciklus listan (loop for (item) on '(1 2 3) do (print item)) //osztaly definialas es peldanyositasa (defclass Submarine () ((Depth :accessor Depth :initform 100))) (setq Sub (make-instance 'Submarine)) (describe Sub) (depth Sub) (setf (depth Sub) 200) //struktura letrehozasa es peldanyositasa (defstruct person name age) (setq dave (make-person :name "Dave" :age 22)) (person-name dave) (person-age dave) //generikus metodus (defmethod Square ((X number)) (* X X)) (Square 10) (Square 10.0)

Néhány Project Euler feladat megoldása Lisp-ben

Készítette: Gévay Gábor, 2013.

Common Lisp alatt íródtak és clisp fordítóval lettek tesztelve.

Források