2012-09-22 22 views
6

Neden Forth, ENDIF yerine THEN ... ifadesini kullanıyor?Neden Forth, ENDIF yerine THEN ... ifadesini kullanıyor?

(Uyumsuz) İleri Derleyici olayını yapıyorum. Temel olarak, Forth'ın sözdizimi, IF beyanları konusunda bana karşı çok sezgisel görünmektedir.

IF ."Statement is true" 
ELSE ."Statement is not true" 
THEN ."Printed no matter what; 

Neden biten ifadesi bir THEN mı? Bu, dilin bana çok garip geldiğini gösteriyor. Derleyicim için daha doğal olan ENDIF gibi bir şeye değiştirmeyi düşünüyorum. Ancak, ilk etapta geriye doğru IF-THEN ifadelerine sahip olmanın ardındaki mantık neydi?

+0

Bunun programcılar için daha uygun olacağını düşünen var mı? – Earlz

+1

Chuck Moore'a sormanız gerekecek. Kimse cevabı bilmeyecek. [Burada bir zamanlar eleştirilen postfix koşullu] [http://www.colorforth.com/HOPL.html] tanıttığı zaman belirtir. –

+0

Eğer çok fazla yanılmamışım, ENDIF'in THEN'in bir eşanlamlısı olarak tanımlandığı yerde (ya da belki de olsa) uygulamaların (şu anda ne olduğunu hatırlayamıyorum) vardır. 'IF-ELSE-THEN' dizisini biraz sıra dışı bulmak. Ben de onunla hiç problemim olmadı. (Sanırım uzun bir süre önce bir kitapta bunun bir açıklamasını gördüm ve @AshleyF'nin cevabında söylediği gibi oldu.) –

cevap

6

Sadece "Bunu yapmak, ELSE bunu, vaka olduğunu IF ... ve THEN ile ... devam et", olarak düşünmek daha iyisi

Veya, Factor, RetroForth gibi kullanım alıntılar (...) bu durumda özel derleme zamanı kelimeleri olmadan tamamen postfix; Yığınlardan adres alan sadece normal kelimeler: [ do this ] [ do that ] if veya [ do this ] when veya [ do that ] unless. Ben bunu kişisel olarak tercih ederim.

Kenara RE: İşte alıntılar

how quotations are compiled in RetroForth olduğunu. Kendi Forth'ım (kendi VM'm için derleme yapar), bir sonraki adresi yığına iter ve n-baytların üzerine atlayan bir QUOTE talimatı ekledim. N-byte'ların bir RETURN talimatı tarafından sonlandırılması beklenir ve if, when, unless sözcükleri, önceki alıntılar tarafından bırakılan adres (ler) ile birlikte bir yüklemi tüketir; uygun şekilde çağırmak. Gerçekten çok basit ve alıntılar genellikle all kinds of beautiful abstractions away from thinking about the stack için kapıyı açar.

+0

Alıntıları hiç duymadım! Bu mükemmel bir soyutlama mekanizmasına benziyor. Bu projeye ilk başladığımda, Forth – Earlz

+1

'da anonim işlevlerin mümkün olup olmadığını merak ettim. Bu durum için geçerli olabilir veya olmayabilir, ancak "Birleştirici Dillerin Neşesi" nin 1. bölümü (Bölüm 1) (http://www.codecommit.com/blog/cat/the-joy-of-concatenative-languages-part-1), [Part 2] (http://www.codecommit.com/blog/cat/the- neşe-birleşme-dilleri-bölüm-2), [Bölüm 3] (http://www.codecommit.com/blog/cat/the-joy-of-concatenative-languages-part-3)) durumları: " Koşullar da ilk bakışta oldukça garip görünüyor, ancak yüzeyin altında son derece zarifler ... " –

+0

Biraz daha düşündükten sonra onunla bir sorunum var. 1 [10] [20] gibi bir şeyi nasıl uygularsınız? Eğer beklenen çıktı "10" olmalıdır. Ancak, yığın satırdan çıkar ve tırnak "geri döndüğünde", ya 10'a döner. 'veya' 20' doğru değil. Ya da bu böyle iç iadeler için ikincil bir "gizli" çağrı yığını ile uygulanmalıdır? – Earlz

İlgili konular