Doğru. Tüm programlar duruncaya kadar devam eder. Bir devamı, temelde uygulama tarafından yapılan hesaplamada genellikle bir adımdır.
Sizin örnek: * İlk bitirmek için
(+ (* 2 3) 5)
kombinasyonu + kombinasyonu bağlıdır. Böylece (+ result 5)
, (* 2 3)
'un devamıdır. Bu bağlamda bir prosedür değil. call/cc
'un faydası, bir devamlılığınız olduğunda pişmanlık duyuyorsunuz ve bunun yerine başka bir şey yapmak istiyor ya da daha sonra tekrar gelmek istiyorsanız. İlk yapmak Sağlar:
(define g 0)
(call/cc
(lambda (exit)
(/ 10 (if (= g 0) (exit +Inf.0) g))))
Açıkçası, devamı olan bir bölümü olduğunda sonucu yapılır, ancak exit
beri kısa + Inf.0 dönmek için devre alır şeyi çalıştırılırsa.
Bunu daha sonra bölümlemeyi yapmadan bir prosedürle nasıl yaparsınız? Bu tarzda, yapamazsın.
Şema, kodunuzu Continuation Passing Style(=CPS) koduna dönüştürdüğünden ve CPS çağrısı/cc'de özel olmadığından bu gerçekten sihir değildir. CPS'de önemsiz yazma kodu değil.
İşte call/cc
(define (kcall/cc k consumer)
(consumer k (lambda (ignore v) (k v))))
Geçerli devamı olan (işlev olarak) argümanı * olan * çağrı/cc' kullanamazsınız. 'Call/cc' kullanmak için sorunuzu düzenleyin! Devam oku [devam] (http://en.wikipedia.org/wiki/Continuation) –
Arama/cc'yi kullanmıyorum, eşdeğer bir fonksiyon kullanıyorum sürekliliği temsil ediyor mu? – ayhid
Devam sözdizimsel olarak bir işlevdir, ancak bir kontrol aktarımını temsil eder. Çağrı protokolü bir fonksiyondan farklıdır - asla geri dönmemesi gerekiyordu. –