2012-06-15 21 views
5
(define get-first 
    (lambda (l) 
    (call-with-current-continuation 
     (lambda (here) 
     (set! leave here) 
     (waddle l) 
     (leave (quote())))))) 

(define get-first 
    (lambda (l) 
    (call-with-current-continuation 
     (lambda (here) 
     (set! leave here) 
     (leave (waddle l)))))) 

için görünüşte modeli eşyordamlar yaprakları sadece vermesidir waddle geçirilen bir ağacın yineleme yapmak. Hemen önce ikinci-en son yeniden giriş waddle 'ın verim nedeniyle, bu sadece bir waddlearasında, '() verimli bir gerçek değerini saf değerini '() yani yerine dönecektir yere Yeniden giriş noktasını belirler Tümüyle saf bir işlevmiş gibi'(). Da, bu akılda tutarak Deneyimli Schemer en olsun ilk, get-gelecek ve badi fonksiyonları kitabın "Deneyimli Schemer", <code>get-first</code>, <code>get-next</code> aşina ve <code>waddle</code> (son iki değil burada tanımlanan) olan prosedürler değil herkes için

, bunun get-first içinde call/cc içinde olacaktır, ... yukarı get-first setleri "gerçek" zaman waddle döner ne görebilir ve sonra (leave (quote())) get-first değeridir (ve leave nedenle '() "gerçek" dönüşü) yapar get-next ki, geçen tekrarında get-next dönmek için tasarlanmıştır.

Neden ikinci sürüm eşdeğer değil, waddle'un '() değeri leave argümanı olabilir? "leave" Ben bunu istiyorum fonksiyonu olmadığı için

+0

Nevermind ... "ayrılmak" Ben * olmasını istiyorum * işlev değil, ancak işlevi onun sol-sağ-to edilecek ve böylece "waddle önce görünen hangi değerlendirildiğinde olarak değerlendirildiğinden, karışıklık ". Bu, daha önce ifadede ne koyulduğunu değerlendirdiği anlamına gelir. Ahlaki: işlevine çağrı İÇİNDE yeniden tanımlanması tabi işlevlerini kullanırken dikkat! Bu, sağdan sola bir yorumlayıcının üzerindeyse, sembol izninin herhangi bir yere bırakılan işlev olarak bakılmasından önce, bu arada bir FARKLI işlev olarak ayarlanacaktır. Ne dağınıklık ... – user1457584

+2

Çözüldüğünü duyduğuma sevindim, ancak lütfen cevabı bir yanıt olarak gönderin (burada bir yorumdan ziyade) ve kabul edin. Bu şekilde insanların soruları görebileceği şekilde buraya gelmeden çözülür. – Bridge

+0

user1457584 @ iki sürüm derlemek olmaz: 'set !: ilişkisiz tanımlayıcı modülünde yer: Cevabı yazmış olsa bile, Sen Sorunuza yanıt işaretlemeniz gerekir – alfasin

cevap

3

karışıklık olduğunu, ancak işlevi o sağa-sola ve böylece "waddle" önce gibi görünen, değerlendirildiğinde ne zaman olarak değerlendirilir. Bu, önceki ifadede, sadece neye ayarlandığını değerlendirdiği anlamına gelir.

Ahlak: işlevine çağrı İÇİNDE yeniden tanımlanması tabi işlevlerini kullanırken dikkat! Eğer bu bir sağdan sola çeviriciyse waddle, leave sembolü, "FARKLI" bir fonksiyona ayarlanacağı yer olan "yaprakları" işlevi olarak algılanmadan önce değerlendirilecektir.

+2

leave'. Aksi takdirde cevapsız listede görünür. –