Şimdiye kadar iyi cevapların var; Size, yığınlar veya “kontrol akışı” nosyonu olmadan bir dili nasıl tasarlayabileceğinize dair pratik olmayan ancak eğitici bir örnek vereyim. İşte faktörleri belirleyen bir program:
function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = f(3)
Bu programı bir dizgeye koyduk ve programı metin değişikliği ile değerlendiriyoruz. Bu yüzden, değerlendirirken f(3)
, bir arama yaparız ve i için 3 ile değiştiririz:
function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = if 3 == 0 then 1 else 3 * f(3 - 1)
Harika. Şimdi bir başka metin değiştirme işlemi gerçekleştiriyoruz: "if" nin koşulunun yanlış olduğunu ve programı üreten başka bir dize yaptığını görüyoruz:
function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = 3 * f(3 - 1)
Şimdi, sabitleri içeren tüm alt ifadelerde başka bir dize değiştirelim:
function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = 3 * f(2)
Ve bunun nasıl gittiğini görüyorsunuz; Daha fazla emek vermeyeceğim. Aşağı inene let x = 6
ve bitinceye kadar bir dizi ip yerine geçmeye devam edebiliriz .
Yığını geleneksel olarak yerel değişkenler ve devam bilgisi için kullanırız; unutmayın, bir yığın size nereden geldiğinizi söylemez, o da elinizde bu dönüş değerinin yanında nereye gideceğinizi gösterir.
Dizge programlama modelinde, yığında "yerel değişkenler" yoktur; biçimsel parametreler, işlev yığındaki bir arama tablosuna yerleştirilmek yerine, bağımsız değişkenine uygulandığında değerleri ile değiştirilir. Ve “sonraki bir yere gitme” yoktur, çünkü program değerlendirme, farklı ancak eşdeğer bir program üretmek için string yerine basit kurallar uygulamaktadır.
Şimdi, elbette, aslında sicim yerine geçmek muhtemelen gitmenin yolu değil. Ancak “eşitlikçi akıl yürütmeyi” (Haskell gibi) destekleyen programlama dilleri mantıklı bir şekilde bu tekniği kullanıyor.