9

Oleg'in ve Asai'nin "mankenler için" sınırlandırılmış sürekliliklerini inceliyorum (http://pllab.is.ocha.ac.jp/~asai/cw2011tutorial/main-e.pdf) fakat bu çalışma vardiya/sıfırlamayı kullanıyor Oleg'in delimcc'inde mevcut olan istemi maddeleri yerine formalizm. Bu yüzden birkaç sorum var:Vardiya/sıfırlama delimcc'e nasıl çevrilir?

Her şeyden önce, bir komut nedir? Ve neden shift ve diğer işlevler? Alt-denetimin ne olduğunu bilmek güzel olurdu ama ben sadece kağıttan geçmek istediğim için bunu atlamaya razıyım. Ayrıca, shift ve shift0 arasındaki fark nedir ve kağıtta shift'a nasıl karşılık gelirler.

Ayrıca, delimcc içinde reset nedir? Benim hislerim, new_prompt ve push_prompt'un bir şekilde reset'a karşılık geldiğini söylüyor. Ama burada da bazı açıklamalara ihtiyacım var.

DÜZENLEME: Basit bir örneği kağıttan çevirebildim ve sezgilerim doğru çıktı. Ancak, farklılıkların gerçek bir açıklamasını istiyorum ve neden delimcc olduğu gibi.

reset (fun() -> 3 + shift (fun _ -> 5 * 2) - 1) 

Delimcc: Burada herkes

Kağıt ilgilendiği durumda her iki sürümü var

let _ = let open Delimcc in 
    let np = new_prompt() in 
    push_prompt np (fun() -> 3 + (shift np (fun _ -> 5 * 2)) - 1) 
+3

Sıfırlama/sıfırlama? Bu kavramı aşina değilim. – Strawberry

+1

SO'da [oleg] etiketi yok mu? – dubiousjim

+0

“Vardiya” operatörünün kısmi değerlendirme için sözdizimsel şeker uyguluyormuş gibi görünüyor. Yani, 'vardiya' bir argümana sahiptir, fakat dolaylı olarak yapılır, ve onun eklenmesi onun yanında bedende bir alt çizgi ile gösterilir. Birisi vardiya/sıfırlama konsepti ile uğraşıyorsa, bu ek şeker bir zorluk katmanı ekleyebilir. – Kaz

cevap

10

ben senin, Oleg'in sunumunun dergi versiyonudur this paper başlangıcını okumanızı öneriyoruz delimcc. Bu, delimcc'un makul bir şekilde anlaşılmasını sağlar ve makalenizin kaydırma/sıfırlama örneğini delimcc'un çok satırlı ayarına getirmenizi sağlar.

Sizi ilgilendirebilecek iki alıntı.

sınırlandırılmış kontrolü ile zaten aşina okuyucu keyfi çok ‘lezzetler’ ayraçları kontrol etmek sıfırlama sıradan vardiya/bir genelleme olarak delimcc görebilirsiniz: İlk Yukarıda işaret dergi versiyonundan olduğunu. new_prompt işlevi, yeni, benzersiz bir çeşidinin kontrol sınırlayıcısı veya komut istemi oluşturur. push_prompt p (fun() -> e), reset e genelleştirmesi ifadesi, p denetim sınırlayıcısını yığına koyar ve sonra e; take_subcont p f yığının önekini, verilen p işaretli en yakın yığına çerçeveye kadar kaldırır. kesme sınırlayıcısı p kesilmiş olan yığının çıkartılan kısmı, soyut tip alt denetiminin bir devam nesnesi olarak paketlenir ve take_subcont'un f numaralı argümanına geçirilir. push_subcont işlevi, kaldırılmış yığın çerçevelerini yığına, muhtemelen farklı bir bağlamda geri koyar, böylece yakalanan sınırlanmış sürekliliği eski haline getirir.

ikinci Hala burada GNU Guile's documentation

geliyor? Yani, biri call-with-prompt gibi sınırlandırılmış bir kontrol operatörünü uyguladığı zaman, birinin iki karar vermesi gerekir. İlk olarak, işleyici komut isteminin içinde veya dışında mı çalışır?İşleyicinin komut isteminde çalışmasını sağlamak, işleyicinin içinde iptal edilmesini, genellikle yararlı olan aynı ileti işleyicisine geri dönmesini sağlar. Ancak, işleyiciden gelen kuyruk çağrılarını engeller, dolayısıyla daha az geneldir.

Benzer şekilde, yakalanan bir devamı çağırmak bir istemi yeniden etkinleştirir mi? Yine uygun kuyruk çağrılarına karşı rahatlık zararı var.

Bu kararlar, Felleisen F operatöründe yakalanır. Süreklilikler veya işleyiciler bir istemi dolaylı olarak eklemezse, operatör –F– olarak bilinir. Bu, Guile'nin call-with-prompt ve abort-to-prompt için geçerlidir.

Hem devam hem de işleyici örtülü olarak komut istemleri eklerse, kullanıcı + F +'dir. shift ve reset, bu tür işleçlerdir.

sonuçlandırmak için: new_prompt çağıran o reset almak için bir yoldur yüklemek sonra push_prompt bir istem almak ve o haklısın. Aslında, sadece bir kez new_prompt numaralı telefonu aramanız yeterlidir ve her zaman aynı genel istemde bulunabilir ve her zamanki gibi shift/reset davranışını alabilirsiniz (farklı istemlerin bildirilmesi size yalnızca biraz daha özgürlük verir).

Son olarak, ilkelleriyle shift tanımlanabilir ve bu kitaplıkta yapılan işlemdir. shift çağrıları take_subcont, hemen (aynı) komut istemini yeniden yükler ve kullanıcıya iptal edilen hesaplamayı yeniden başlatan bir işlevi sağlar. shift0 aynı şeyi yapar, ancak istemini yeniden yüklemez. delimcc kodunda:

let shift p f = take_subcont p (fun sk() -> 
    push_prompt p (fun() -> (f (fun c -> 
    push_delim_subcont sk (fun() -> c))))) 

let shift0 p f = take_subcont p (fun sk() -> 
    f (fun c -> push_delim_subcont sk (fun() -> c))) 
+0

Teşekkürler gasche, bu beni sindirmek için biraz zaman alacak ... – rgrinberg