>>>>> "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

Cevap