คุณได้รับคำตอบที่ดีมาแล้ว ให้ฉันเป็นตัวอย่างที่ทำไม่ได้ แต่ให้ความรู้สูงเกี่ยวกับวิธีที่คุณสามารถออกแบบภาษาโดยปราศจากความคิดของสแต็คหรือ "การควบคุมการไหล" ได้เลย นี่คือโปรแกรมที่กำหนดแฟคทอเรียล:
function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = f(3)
เราใส่โปรแกรมนี้ในสตริงและเราประเมินโปรแกรมโดยการทดแทนข้อความ ดังนั้นเมื่อเราประเมินf(3)
เราทำการค้นหาและแทนที่ด้วย 3 สำหรับ i ดังนี้:
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)
ยิ่งใหญ่ ตอนนี้เราทำการทดแทนตัวบทอื่น: เราเห็นว่าเงื่อนไขของ "if" เป็นเท็จและทำการแทนที่สายอักขระอื่นโดยสร้างโปรแกรมขึ้นมา:
function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = 3 * f(3 - 1)
ตอนนี้เราทำสายอักขระอื่นแทนที่นิพจน์ย่อยทั้งหมดที่เกี่ยวข้องกับค่าคงที่:
function f(i) => if i == 0 then 1 else i * f(i - 1)
let x = 3 * f(2)
และคุณจะเห็นว่ามันเป็นอย่างไร ฉันจะไม่ใช้แรงงานจุดต่อไป เราสามารถทำชุดของการแทนที่สตริงจนกว่าเราจะลงไปlet x = 6
และเราจะทำ
เราใช้สแต็กแบบดั้งเดิมสำหรับตัวแปรท้องถิ่นและข้อมูลความต่อเนื่อง จำไว้ว่าสแต็คไม่ได้บอกคุณว่าคุณมาจากไหนมันจะบอกคุณว่าคุณจะไปไหนต่อเมื่อมีค่าส่งคืนนั้นอยู่ในมือ
ในโมเดลการแทนที่สตริงของการเขียนโปรแกรมไม่มี "ตัวแปรโลคัล" บนสแต็ก พารามิเตอร์ที่เป็นทางการจะถูกแทนที่ด้วยค่าของพวกเขาเมื่อฟังก์ชั่นถูกนำไปใช้กับการโต้แย้งมากกว่าใส่ลงในตารางการค้นหาบนสแต็ค และไม่มี "ไปที่ไหนสักแห่งต่อไป" เพราะการประเมินผลของโปรแกรมเป็นเพียงการใช้กฎง่ายๆสำหรับการทดแทนสตริงเพื่อสร้างโปรแกรมที่แตกต่างกัน แต่เทียบเท่า
ตอนนี้แน่นอนว่าการใช้การแทนที่สตริงอาจไม่ใช่วิธีที่จะไป แต่ภาษาการเขียนโปรแกรมที่รองรับ "การให้เหตุผลเชิงเหตุผล" (เช่น Haskell) นั้นใช้เหตุผลเชิงตรรกะโดยใช้เทคนิคนี้