Common Lisp
Ten podręcznik należy dopracować |
Środowiska:
- OS: linux
- Ubuntu
- windows
- IDE: Emacs 22.2.1
- mode:
- major mode: inferior-lisp
- minor mode: slime
- mode:
Przygotowania
edytujpraca w konsoli
edytujAby zainstalować Common Lispa ( tu SBCL) w Ubuntu należy w konsoli wpisać:
sudo apt-get install sbcl
Uruchomiamy sbcl poprzez wpisanie w konsoli:
sbcl
Otrzymujemy:
This is SBCL 1.0.29.11.debian, an implementation of ANSI Common Lisp. More information about SBCL is available at <http://www.sbcl.org/>. SBCL is free software, provided as is, with absolutely no warranty. It is mostly in the public domain; some portions are provided under BSD-style licenses. See the CREDITS and COPYING files in the distribution for more information. *
Aby zakończyć SBCL, możemy nacisnąć Ctrl-z
Jeśli w programie zostanie wykryty błąd, to włączy się odpluskwiacz i zmieni znak zachęty:
0]
aby wyjść z niego wprowadź "0":
0] 0 *
Czasem włączy się niskopoziomowy odpluskwiacz:
Welcome to LDB, a low-level debugger for the Lisp runtime environment. ldb>
Aby wyjść wprowadź "quit" i potem "y":
ldb> quit Really quit? [y]
praca z IDE (Emacs)
edytujMożna wykorzystać Emacsa jako edytor oraz IDE. Jest to omówione w podręcznikuEmacsa
Technika pracy w Lispie
edytujWprowadzanie poleceń
edytujMamy kilka sposobów:
- wprowadzać pojedyncze polecenia (patrz wyżej)
- wczytać plik z programem (tryb wsadowy, ang. batch mode)
- wczytać biblioteki, a następnie wprowadzić polecenia
Tryb wsadowy
edytujTworzenie i edycja pliku
edytujWczytywanie pliku
edytujSprawdzamy domyślny katalog:
*default-pathname-defaults*
Jeśli plik q.lisp znajduje się w tym katalogu to możemy go wczytać:
(load "q.lisp")
Lepiej użyć makra definiującego ścieżkę:[1]
(load #p("/path/to/file"))
W środowisku windows:[2]
(load "c:\\temp\\testload")
lub funkcji make-pathname:[3]
(load (make-pathname :device "c" :directory '(:absolute "temp") :name "testload"))
lub:
(load (make-pathname :device "c" :directory '(:absolute "temp") :name "testload") :if-does-not-exist (load (make-pathname :device "c" :directory '(:absolute "temp") :name "testload2"))
Kompilacja
edytujJeśli wczytujemy plik z kodem w lispie (źródłowy) za pomocą funkcji load to po wczytaniu następuje automatyczna kompilacja [4]
Kompilacja pojedynczej funkcji:
(compile 'nazwa-funkcji)
Kompilacja pliku:
(compile-file "l.lisp" :output-file "l")
Otrzymujemy plik l.fasl. Możemy go uruchomić z linii poleceń:
chmod +x l.fasl ./l.fasl
Uruchomienie programu
edytuj(nazwa-funkcji lista-parametrów)
Profilowanie programu
edytujMożemy użyć makra time aby sprawdzić czas wykonania wyrażenia exp [5]
(time < exp>)
Profiler nie jest częścią standardową Common Lispa,[6] ale powinien być w każdej wersji. Np. w SBCL jest sb-sprof[7].
Programowanie
edytujStałe
edytujStałe globalne definiujemy za pomocą makra defconstant:
(defconstant iSide 33 "side of rectangular plane / viewport / image in pixels ")
Pętle
edytujPętla z użyciem makra loop: [8]
(loop for y from -1.5 to 1.5 by 0.5 do (format t (concatenate 'string "y= " (write-to-string y) "~%")))
wynik działania:
y= -1.5 y= -1.0 y= -0.5 y= 0.0 y= 0.5 y= 1.0 y= 1.5 NIL
Inne parametry:
(loop for y from -1.5 to 1.5 by 0.4 do (format t (concatenate 'string "y= " (write-to-string y) "~%")))
Wynik działania:
y= -1.5 y= -1.1 y= -0.70000005 y= -0.30000004 y= 0.099999964 y= 0.49999997 y= 0.9 y= 1.3 NIL
Jak widać w tym przykładzie końcowy parametr 1.5 nie został osiągnięty.
peflags
edytujzastosowanie peflags (mały program z Cygwin) do zwiększania wielkości stosu i sterty:[9]
peflags --stack-reserve sbcl.exe
sbcl.exe: stack reserve size : 2097152 (0x200000) bytes
peflags --stack-reserve=0x1000000 sbcl.exe
sbcl.exe: stack reserve size : 16777216 (0x1000000) bytes
Źródła
edytuj- ↑ Sharpsign dokumentacja
- ↑ Lisp Load Function w daniweb
- ↑ make-pathname dokumentacja
- ↑ HyperSpec funkcji load
- ↑ Profiling Lisp programs z Uniwersytetu Minnesota
- ↑ Successful Lisp: How to Understand and Use Common Lisp by David B. Lamkins, Chapter 28 - Practical Techniques for Programming
- ↑ Podręcznik SBCL, Statistical Profiler
- ↑ hcomparing-loop-and-iterate by Stephen Bach
- ↑ Dyskusja o peflags na grupie dyskusyjnej Maxima CAS