>>>>> "ek" == emre kayikcilar <[EMAIL PROTECTED]> writes:
[...]
ek> Bu arada sorularim: 1)" Special functions" terimini tam olarak
ek> kavrayamadım.Yani açıkça anlatmak gerekirse bir yerde "special
ek> functions" terimini gördüğüm de olayi bir türlü kafamda
ek> canlandiramiyorum. Kitabin arkasindaki tanima bakmak zorunda
ek> kaliyorum. Bu da takdir edersiniz ki cok can sıkıcı bişey. Bu
ek> terimi bana aciklarsaniz cok sevinirim.
Bu 'special function' herhalde Touretzky'nin kullandigi ve simdi
standart olmayan bir terim. 'Special form' ve 'special operator'
hem standart hem daha dogru. Hyperspec'ten link vereyim:
http://www.lispworks.com/documentation/HyperSpec/Body/03_ababa.htm
Macrolari bir tarafa birakalim simdilik[1], oradaki listeden 'if'in niye
ozel oldugunu ve niye normal fonksyon olmayacagina bakalim (bu standart
ornektir usendigim icin sizin kitabi indirip bakmiyorum, orada zaten
varsa ozur dilerim.) Once kaba hatlariyla Common Lisp'te bir fonksyonu
cagirdigimizda ne olduguna bakalim:
Fonksyonumuz su olsun:
(defun bizim-fonksyon (a b c)
(if a b c))
(bizim-fonksyon a b c)
dedigimizde once (soldan saga[2]) a b ve c formlari 'evaluate' edilir
mesela
(bizim-fonksyon (> 1 2) :evet :hayir) diye cagirdigimizda
a=nil, b=:evet, c=:hayir olur. Neden? O formlarin degerleri oyle cunku.
Gostereyim:
CL-USER> (> 1 2)
NIL
CL-USER> :evet
:EVET
CL-USER> :hayir
:HAYIR
O degerlerle cagrilinca fonksyonun icindeki if formu da su halde gelir:
(if nil :evet :hayir)
yani
CL-USER> (if nil :evet :hayir)
:HAYIR
yani
CL-USER> (bizim-fonksyon (> 1 2) :evet :hayir)
:HAYIR
Pekiyi, simdi yukarida verdigim hyperspec linkindeki tarife gore
bizim-fonksyon 'special' degil gayet normal bir fonksyon. If'in
yerine gecebilir miydi? Yani herhangi bir (if <from> <then-form>
<else-form>) (bizim-fonksyon <from> <then-form> <else-form>) diye
yazilabilir miydi?
Soyle deneyelim:
CL-USER> (if (= 1 1) :esit (/ 1 0))
:ESIT
ama
CL-USER> (bizim-fonksyon (= 1 1) :esit (/ 1 0))
*** HATA ***
niye? Yukari donelim, ve bir fonksyon cagilirken ne yapildigina bakalim.
Bu durumda a=t, b=:esit, pekiyi c=? If _normal fonksyon olmadigi icin_
(if a b c) diye kullandigimizda eger sadece a NIL ise c evaluate
oluyor. Bizim durumda a t oldugu icin c evaluate olmadi.
Normal fonksyon olsa idi, olay boyle gelismeyecekti: a, b ve c'nin
_degerleri_ ile cagrilacakti. Ama goruyoruz ki bu durumda c formunun
degeri tanimli degil.
Bu sadece cok basit bir ornek. Yukarida linkini verdigim hyperspec
tarifinden bir alintida bu ornegin gostermeye calistigi ana fikri
buyuk harfe cevirip baglayayim:
"A special form is a form with special syntax, SPECIAL EVALUATION
RULES, or both, possibly manipulating the evaluation environment,
control flow, or both."
ek> 2) Hala "slime + sbcl
ek> + emacs" üclüsünü hayata gecirememis biri olarak "Allegro
ek> Common Lisp" kullanmaktayım. Debug window' a öğrendiklerimi
ek> yazmaktayım. Fakat isin uygulama calisma kismini cozmüs
ek> degilim. Ornegin ben disaridan aldigim bir lisp kodunu
ek> calistirmak istedigimde onu nereye yazacagim.
O ortami bilmiyorum malesef. Yalniz compile-file, load filan gelistirme
ortaminin degil dilin ozellikleri. Yani /tmp/dosya.lisp dosyasinda
(defun bana-selam-ver () (format t "~& Merhaba ~%"))
varsa.
CL-USER> (load "/tmp/dosya.lisp")
T
CL-USER> (bana-selam-ver)
Merhaba
NIL
yapabiliyor olmalisiniz en azindan.
BM
[1] Neden? Cunku macrolara yedirdigimiz formlar icin
'evaluation rule' bizim kontrolumuzda.
[2] Bu soldan saga isi Scheme'de yoktur yanlis hatirlamiyorsam.
_______________________________________________
cs-lisp mailing list
[email protected]
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp