Discussion:
Fonksiyon Gölgeleme
Volkan YAZICI
2007-02-21 17:42:47 UTC
Permalink
Merhaba,

CL'de dinamik değişkenleri

(let ((*glob-var* <newval>)
...)
...)

şeklinde gölgeleyebildiğimiz gibi, benzer şekilde fonksiyonları da
dynamic scope çerçevesinde gölgelememiz mümkün mü? Merak ettiğim,
(örnek olarak) MAP fonksiyonunun bizim belirttiğimiz CONS fonksiyonunu
kullanmasını sağlayabilir miyiz? Eğer böyle bir şey mümkün değilse,
benzer bir durumda MAP fonksiyonunu baştan yazmak dışında
alternatiflerimiz neler?


İyi çalışmalar.
Tonguc Yumruk
2007-02-21 20:12:20 UTC
Permalink
(bkz: flet)
http://www.lisp.org/HyperSpec/Body/speope_fletcm_scm_macrolet.html
Post by Volkan YAZICI
Merhaba,
CL'de dinamik değişkenleri
(let ((*glob-var* <newval>)
...)
...)
şeklinde gölgeleyebildiğimiz gibi, benzer şekilde fonksiyonları da
dynamic scope çerçevesinde gölgelememiz mÃŒmkÃŒn mÃŒ? Merak ettiğim,
(örnek olarak) MAP fonksiyonunun bizim belirttiğimiz CONS fonksiyonunu
kullanmasını sağlayabilir miyiz? Eğer böyle bir şey mÃŒmkÃŒn değilse,
benzer bir durumda MAP fonksiyonunu baştan yazmak dışında
alternatiflerimiz neler?
İyi çalışmalar.
_______________________________________________
cs-lisp mailing list
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp
--
Sevgi Saygı GNU/Linux
########################################################################
Fuch's Warning:
If you actually look like your passport photo, you aren't well
enough to travel.
########################################################################
Tonguç Yumruk
Volkan YAZICI
2007-02-21 20:43:02 UTC
Permalink
Merhaba,

Bildiğim kadarı ile FLET lexical scope'ta geçerli oluyor. Şöyle ki:

(defun cons-test (p q)
(cons p q))

(defun mapcar-test (proc lst)
(if (null lst) '()
(cons-test (funcall proc (first lst))
(mapcar-test proc (rest lst)))))

(flet ((cons-test (p q) (cons 1 (cons p q))))
(mapcar-test #'(lambda (p) (* p 2)) '(1 2 3 4)))
=> '(2 4 6 8)

MAPCAR-TEST, FLET tarafından tanıtılan CONS-TEST'i dikkate almadı. Bu
sebeple özellikle fonksiyonların dynamic scope'ta değerini nasıl
gölgeleyebileceğimizi sormuştum.


İyi çalışmalar.
Haldun Bayhantopcu
2007-02-21 20:52:35 UTC
Permalink
Sanirim istediginiz isi `shadow` fonksiyonu yapiyor. Hakkinda cok
okumadim ama asagidaki gibi deneyince sanki oldu:

* #'car

#<FUNCTION CAR>
* (shadow 'car)

T
* #'car

debugger invoked on a UNDEFINED-FUNCTION in thread #<THREAD "initial
thread" {A7BE401}>:
The function CAR is undefined.

Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.

(SB-INT:EVAL-IN-LEXENV #'CAR #<NULL-LEXENV>)
0] 0

* (defun car () "heyhey")

CAR
* (car)

"heyhey"

Haldun.
Post by Volkan YAZICI
Merhaba,
(defun cons-test (p q)
(cons p q))
(defun mapcar-test (proc lst)
(if (null lst) '()
(cons-test (funcall proc (first lst))
(mapcar-test proc (rest lst)))))
(flet ((cons-test (p q) (cons 1 (cons p q))))
(mapcar-test #'(lambda (p) (* p 2)) '(1 2 3 4)))
=> '(2 4 6 8)
MAPCAR-TEST, FLET tarafından tanıtılan CONS-TEST'i dikkate almadı. Bu
sebeple özellikle fonksiyonların dynamic scope'ta değerini nasıl
gölgeleyebileceğimizi sormuştum.
İyi çalışmalar.
_______________________________________________
cs-lisp mailing list
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp
Bülent Murtezaoğlu
2007-02-27 17:59:10 UTC
Permalink
VY> Merhaba, Bildiğim kadarı ile FLET lexical scope'ta geçerli
VY> oluyor. [...]

Evet. 'Special'lar ve let ile yaptığınız işi, defun/flet ile
yapamazsınız. Tabii bir special'ın değeri olarak bir fonksyon kullanıp
onunla böyle bir iş görebilirsiniz. Gözünüze güzel gözükmez belki ama
işinizi görür (en azından öğrenmek için denemeye değer belki). Tam ne
yapmaya çalıştığınızı söylerseniz belki başka çözümler de aklımıza
gelebilir.

Aycan beyin verdiği link iyi, açık olanına link da ben vereyim:

http://p-cos.net/documents/dynfun.pdf

Bu arada buna 'gölgeleme' demeyelim bence, gölgelemenin (diğer
arkadaşların belirttiği) 'shadowing' manası var, ikisi karışmasın.

BM
Volkan YAZICI
2007-02-28 18:24:20 UTC
Permalink
Merhaba,
Post by Bülent Murtezaoğlu
Evet. 'Special'lar ve let ile yaptığınız işi, defun/flet ile
yapamazsınız. Tabii bir special'ın değeri olarak bir fonksyon
kullanıp onunla böyle bir iş görebilirsiniz. Gözünüze güzel
gözükmez belki ama işinizi görür (en azından öğrenmek için denemeye
değer belki). Tam ne yapmaya çalıştığınızı söylerseniz belki başka
çözümler de aklımıza gelebilir.
Lazy evaluation denemeleri yaparken, bazı fonksiyon ve makroların
(LOOP, REDUCE gibi) benim sağladığım CONS, CAR, CDR türevlerini
kullanmasını istiyorum.
Post by Bülent Murtezaoğlu
http://p-cos.net/documents/dynfun.pdf
Evet bu gerçekten çok iyi oldu.
Post by Bülent Murtezaoğlu
Bu arada buna 'gölgeleme' demeyelim bence, gölgelemenin (diğer
arkadaşların belirttiği) 'shadowing' manası var, ikisi karışmasın.
Peki tam olarak bu işlevin ingilizce karşılığı nedir?


İyi çalışmalar.
Bülent Murtezaoğlu
2007-02-28 18:59:52 UTC
Permalink
[...]
VY> Lazy evaluation denemeleri yaparken, bazı fonksiyon ve
VY> makroların (LOOP, REDUCE gibi) benim sağladığım CONS, CAR, CDR
VY> türevlerini kullanmasını istiyorum.

Doğru anladıysam bu mümkün değil. Mesela reduce'un kendisine verilen
sequence'in car'larına baktığını farzedip o car benimki olsun demek
istiyorsanız, o olmaz. Elbette package mekanizmalarıyla (gölgeleme!)
kendi car/cdr gibi fonksyonlarınızı kullanan kod yazabilirsiniz ama
CL'in verdiği fonksyonların kullandıkları değiştirmeniz mümkün değil.

[...]
VY> Peki tam olarak bu işlevin ingilizce karşılığı nedir?

"Dynamically scoped function" istediğiniz şey. Sorduğunuz o değil,
son tanımın evvelki yerine kullanılması işlevini soryorsunuz yanlış
anlamadiysam . "Execution contour"un içinde en son 'binding'i bulmak
da 'gölgeleme'ye denk düşüyor herhalde. 'The most recent binding in
the execution contour' denebilir belki. Dynamically scoped veya biraz
daha kolaya kaçıp dynamiç binding denince zaten bu anlaşılıyor tabii.
Bir de iyice çorba etmek için, 'special' terminolojisini katip
birşeyler diyebiliriz belki ama ellemeyeyim ona. Şimdi aklıma
gelenler bunlar. Gölgeleme deyince de biraz detay verdiğiniz için
kastınızı anladı buradaki herkes gördüğünüz gibi -- ses etmemin
sebebi doğrudan karşılık olan 'shadowing'in CL'de bir manası olması.

Bu işte benim lafimla hareket etmeye lüzum yok (hatta etmeyin, atlamış
olabilirim), CLL'e sormanız faydalı olabilir.

BM
Mehmet Yavuz Selim Soyturk
2007-02-28 23:24:38 UTC
Permalink
Post by Volkan YAZICI
Merhaba,
(defun cons-test (p q)
(cons p q))
(defun mapcar-test (proc lst)
(if (null lst) '()
(cons-test (funcall proc (first lst))
(mapcar-test proc (rest lst)))))
(flet ((cons-test (p q) (cons 1 (cons p q))))
(mapcar-test #'(lambda (p) (* p 2)) '(1 2 3 4)))
=> '(2 4 6 8)
MAPCAR-TEST, FLET tarafýndan tanýtýlan CONS-TEST'i dikkate almadý. Bu
sebeple özellikle fonksiyonlarýn dynamic scope'ta deðerini nasýl
gölgeleyebileceðimizi sormuþtum.
Eger degistirmis olsaydi bile cons-test cons'u kullandigi icin sonsuz
donguye girmis olacaktik. cons kullanmayan cons'un yerine gececek
herhangi bir fonksiyon yazmak da pek kolay degil. Ama lisp'de esas
cons'a ulasmanin da bir yontemi vardir mutlaka, o sekilde
yapilabilirdi.
--
Mehmet
Aycan iRiCAN
2007-02-21 22:54:58 UTC
Permalink
Post by Volkan YAZICI
Merhaba,
CL'de dinamik değişkenleri
(let ((*glob-var* <newval>)
...)
...)
şeklinde gölgeleyebildiğimiz gibi, benzer şekilde fonksiyonları da
dynamic scope çerçevesinde gölgelememiz mümkün mü? Merak ettiğim,
(örnek olarak) MAP fonksiyonunun bizim belirttiğimiz CONS fonksiyonunu
kullanmasını sağlayabilir miyiz? Eğer böyle bir şey mümkün değilse,
benzer bir durumda MAP fonksiyonunu baştan yazmak dışında
alternatiflerimiz neler?
Dynamically scoped functions as the essence of AOP, Pascal Costanza
http://doi.acm.org/10.1145/944579.944587

Sevgiler...
--
Aycan iRiCAN
KOR Bilişim Teknolojileri
http://www.core.gen.tr/
Loading...