ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² SECD-ΠΌΠ°ΡˆΠΈΠ½Ρƒ

Π Π΅Ρ„Π΅Ρ€Π°Ρ‚ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ рСкурсивного Π±Π»ΠΎΠΊΠ° производится ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Однако ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ отличия. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, компиляция Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, входящих Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π±Π»ΠΎΠΊΠ°, производится Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ контСкстС, Ρ‡Ρ‚ΠΎ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Ρ‚Π΅Π»Π° Π±Π»ΠΎΠΊΠ°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΡΡ‚ΠΈΡ… выраТСниях допустимо ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ впослСдствии вычислСния происходили Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΌ контСкстС, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² SECD-ΠΌΠ°ΡˆΠΈΠ½Ρƒ (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

ΠœΡ‹ ΠΎΠΏΠΈΡΠ°Π»ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ высокоуровнСвой SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹. Однако Π±ΠΎΠ»Π΅Π΅ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ способом описания SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ являСтся описаниС Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΉ SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ выполняСмыми ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ слуТат Π½Π΅ ΠΈΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ выраТСния, ΠΊΠ°ΠΊ это Π±Ρ‹Π»ΠΎ Ρƒ Π½Π°Ρ Π½Π° ΠΏΡ€ΠΎΡ‚яТСнии всСй Π³Π»Π°Π²Ρ‹, Π½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ спроСктированныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Π’ Ρ†Π΅Π»ΠΎΠΌ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ остаСтся Ρ‚ΠΎΠΉ ΠΆΠ΅, Π½ΠΎ ΠΈΠ· Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ исходного языка ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ обозначСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. ΠžΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΡ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈ ΠΈΡ… ΠΈΠΌΠ΅Π½Π° Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ простыми конструкциями — Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌΠΈ адрСсными ΠΏΠ°Ρ€Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ лишь ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ мСстополоТСниС Π² ΠΊΠΎΠ½Ρ‚СкстС Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ значСния. Π˜ΡΡ…ΠΎΠ΄Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ компилируСтся Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ SECD-машиной, Π³Π°ΠΊ Ρ‡Ρ‚ΠΎ вСсь процСсс вычислСний разбиваСтся Π½Π° Π΄Π²Π° этапа: ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ исходного выраТСния ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ SECD-машиной.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, рассмотрим наш простой язык Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ лямбда-исчислСния ΠΈ ΠΎΠΏΠΈΡˆΠ΅ΠΌ процСсс компиляции этого языка Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ опишСм процСсс исполнСния этих ΠΊΠΎΠΌΠ°Π½Π΄. Для этого ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго опишСм процСсс прСобразования ΠΈΠΌΠ΅Π½ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² Π°Π΄Ρ€Π΅ΡΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Ρ‹.

Π’ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΈ исполнСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ имССтся контСкст ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, составлСнный ΠΈΠ· ΠΈΠΌΠ΅Π½ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² исполняСмых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ ΠΈΡ… ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ Π² letΠΈ letrec-Π±Π»ΠΎΠΊΠ°Ρ…. НапримСр, ΠΏΡ€ΠΈ вычислСнии значСния выраТСния.

= 2,.

letrec x.

f = Xy.* x Ρƒ.

in f 3.

Π² Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° вычисляСтся ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… чисСл с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ стандартной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ умноТСния Ρ†Π΅Π»Ρ‹Ρ…, контСкст ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… состоит ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρƒ (со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 3) ΠΈ Π΄Π²ΡƒΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ… ΠΈ f, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² Π±Π»ΠΎΠΊΠ΅ letrec. Π­Ρ‚ΠΎΡ‚ контСкст состоит ΠΈΠ· Π΄Π²ΡƒΡ… «ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ» опрСдСлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… — уровня описания ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² Π±Π»ΠΎΠΊΠ΅ ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π² Π½Π΅Π³ΠΎ уровня описания Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π£Ρ€ΠΎΠ²Π½ΠΈ принято Π½ΡƒΠΌΠ΅Ρ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами, начиная ΠΎΡ‚ Π½ΡƒΠ»Ρ, ΠΏΡ€ΠΈ этом самый Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Π±Π»ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ ноль, Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… Π΅Π³ΠΎ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ — Π½ΠΎΠΌΠ΅Ρ€, Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ больший Π½Π΅Π³ΠΎ. Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ уровня ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π½ΡƒΠΌΠ΅Ρ€ΡƒΡŽΡ‚ΡΡ числами, начиная с Π½ΡƒΠ»Ρ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² Π»ΡŽΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ каТдая пСрСмСнная Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ двумя числами — Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ уровня ΠΈ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π²Π½ΡƒΡ‚Ρ€ΠΈ этого уровня. Π­Ρ‚ΠΈ Π΄Π²Π° числа ΠΈ ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ Π°Π΄Ρ€Π΅ΡΠ½ΡƒΡŽ ΠΏΠ°Ρ€Ρƒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ выполнСния умноТСния пСрСмСнная Ρƒ ΠΈΠΌΠ΅Π΅Ρ‚ Π°Π΄Ρ€Π΅ΡΠ½ΡƒΡŽ ΠΏΠ°Ρ€Ρƒ (0,0), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ находится Π½Π° Π½ΡƒΠ»Π΅Π²ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΈ ΡΠ²Π»ΡΠ΅Ρ‚ся СдинствСнной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π° ΡΡ‚ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Ρ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π°Π΄Ρ€Π΅ΡΠ½ΡƒΡŽ ΠΏΠ°Ρ€Ρƒ (1,0), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это пСрвая пСрСмСнная Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ 1, Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ f Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ своСй адрСсной ΠΏΠ°Ρ€ΠΎΠΉ (1,1). Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ адрСсная ΠΏΠ°Ρ€Π° ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π½ΠΎΠΉ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ мСста Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ осущСствляСтся доступ ΠΊ ΡΡ‚ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π’Π°ΠΊ, Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ пСрСмСнная Ρ… Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ адрСсной ΠΏΠ°Ρ€ΠΎΠΉ (0,0), Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ Ρƒ Π² ΡΡ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²ΠΎΠΎΠ±Ρ‰Π΅ нСдоступна ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π² Π°Π΄Ρ€Π΅ΡΠ½ΠΎΠΉ ΠΏΠ°Ρ€Π΅ Π½Π΅ Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚ся.

Если Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π»ΠΈ контСкст ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² Π²ΠΈΠ΄Π΅ ассоциативного списка, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡΡŒ вмСстС со ΡΠ²ΠΎΠΈΠΌΠΈ значСниями, Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π² Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π΅ контСкста SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ станут Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ значСния, доступ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ адрСсных ΠΏΠ°Ρ€. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΡ‹ΠΌ Π•-рСгистра Π±ΡƒΠ΄Π΅Ρ‚ список элСмСнтов, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… прСдставляСт собой список Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ значСниями ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ уровня. НапримСр, для ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ умноТСния содСрТимоС рСгистра контСкста Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

[[3], [2, f ' ] ].

Π³Π΄Π΅ Ρ‡Π΅Ρ€Π΅Π· f1 ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΎ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (Π₯Ρƒ.* Ρ… Ρƒ).

НСслоТно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ адрСсной ΠΏΠ°Ρ€Π΅ (i, j) Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ‚Π°ΠΊ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ контСкста: getValue (level, number) context = context !! level ! ! number.

Если SECD-машина Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π΅ контСкста ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ список, Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° умноТСния Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ исполнСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄, ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ… ΠΈ Ρƒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ умноТСния (*) Π² Π²ΠΈΠ΄Π΅ сСчСния, Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ собствСнно ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ происходит с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ адрСсных ΠΏΠ°Ρ€, Ρ‚ΠΎ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ эти ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Load (0, 0);

Load (1, 0) ;

LoadFunc Apply;

Apply;

Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρƒ; Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ…; Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ умноТСния;

— ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ умноТСния ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρƒ; ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρƒ.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ пСрСвСсти (ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ) ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠΌ языкС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ лямбда-исчислСния Π² ΡΡ‚Ρƒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄, Π½ΡƒΠΆΠ½ΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ компиляции Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΊΠ°ΠΊΠΈΠ΅ адрСсныС ΠΏΠ°Ρ€Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ компиляции Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ список, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ хранятся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠΌ Π°Π΄Ρ€Π΅ΡΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Ρ‹. ΠŸΡ€ΠΎΡ‰Π΅ всСго ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот список Π² Ρ‚очности Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΡΠΏΠΈΡΠΎΠΊ адрСсных ΠΏΠ°Ρ€, Ρ‚ΠΎΠ³Π΄Π° адрСсная ΠΏΠ°Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ просто Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒΡΡ ΠΏΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² ΡΠΏΠΈΡΠΊΠ΅. НапримСр, Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ компиляции выраТСния (* Ρ… Ρƒ) Π² Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ список Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π» структуру [[" Ρƒ" ], [" X", «f» ]].

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ addr, которая ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ списку ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ· ΡΡ‚ΠΎΠ³ΠΎ списка вычисляСт Π°Π΄Ρ€Π΅ΡΠ½ΡƒΡŽ ΠΏΠ°Ρ€Ρƒ этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ρ‚ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΠ΅ адрСсной ΠΏΠ°Ρ€Ρ‹ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ закончится ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ — ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ пСрСмСнная Π² ΡΠΏΠΈΡΠΊΠ°Ρ…, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… контСкст ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ найдСтся:

addr: Eq, Π° => Π° -> [[Π°]] -> (Int, Int).

addr var (varsrrest) = case findlndex (== var) vars of Nothing -> (lev + 1, num).

Just idx -> (0, idx).

where (lev, num) = addr var rest Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΡƒΠΌΠ΅Π΅ΠΌ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ адрСсныС ΠΏΠ°Ρ€Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ ΠΏΡ€ΠΎΡ†Π΅ΡΡΡƒ компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ нашСй SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня. Однако ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ это Π΄Π΅Π»Π°Ρ‚ΡŒ, слСдуСт Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ эта машина.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° рСгистров ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня такая ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Ρƒ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ высокого уровня, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π΅ контСкста хранится Π½Π΅ Π°ΡΡΠΎΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ список ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… с ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΡΠΌΠΈ, Π° Π΄Π²ΡƒΡ…ΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ список Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ адрСсных ΠΏΠ°Ρ€. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅, ΠΈΠΌΠ΅Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ описаниС SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹:

type Context = [ [WHNF] ].

type Stack = [WHNF] type Environment = Context type Control = [Command].

type Dump = [(Stack, Environment, Control)] type SECD = (Stack, Environment, Control, Dump).

ОсновноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ этой ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΎΡ‚ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ высокого уровня состоит Π² Π½Π°Π±ΠΎΡ€Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ… ΠΈΡ… Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π½Π΅ ΡΠ»ΠΎΠΆΠ½Ρ‹Π΅ выраТСния исходного языка, ΠΊΠ°ΠΊ это Π±Ρ‹Π»ΠΎ Ρ€Π°Π½ΡŒΡˆΠ΅, Π° ΠΏΡ€ΠΎΡΡ‚Ρ‹Π΅ инструкции, содСрТащиС Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Ρ‚ΠΎΠ»ΡŒΠΊΠΎ простыС ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹ ΠΈΠ»ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ². ΠœΡ‹ Π²ΡΠ΅ ΠΆΠ΅ Π±ΡƒΠ΄Π΅ΠΌ Π΄ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ содСрТали Π²Π½ΡƒΡ‚Ρ€ΠΈ сСбя ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ наши ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ высокого уровня, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌΠΈ структуру Π΄Π΅Ρ€Π΅Π²Π°, Π½ΠΎ ΠΌΡ‹ Π½Π΅ станСм ΡƒΡΠ»ΠΎΠΆΠ½ΡΡ‚ΡŒ Π½Π°ΡˆΡƒ ΠΌΠ°ΡˆΠΈΠ½Ρƒ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ ΠΈ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄.

Π‘ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ составныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ управлСния. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π°ΠΌΠΈ составных ΠΊΠΎΠΌΠ°Π½Π΄ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²Ρ‹Π±ΠΎΡ€Π° ΠΈΠ· Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ² Select ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° образования замыкания для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ LoadFunc.

Π’ ΡΠΏΠΈΡΠΎΠΊ ΠΊΠΎΠΌΠ°Π½Π΄ SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня часто Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для выполнСния ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ лямбдаисчислСния, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ слоТСниС ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ арифмСтичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, сравнСния, логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ образования списков CONS ΠΈ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ TUPLE-k ΠΈ Π΄Ρ€. ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ этого Π΄Π΅Π»Π°Ρ‚ΡŒ, считая, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅, Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ систСмой, прСдставлСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ intrinsic, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π΅ΠΉ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ ΡΠΏΠΈΡΠΎΠΊ Π΅Π΅ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ². Для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π° ΡΡ‚Π΅ΠΊ Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ констант (LoadConst), ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° простоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΠΎΠΉ константы. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ значСния ΠΈΠ· ΠΊΠΎΠ½Ρ‚Скста ΠΏΠΎ Π°Π΄Ρ€Π΅ΡΠ½ΠΎΠΉ ΠΏΠ°Ρ€Π΅ (Load), ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ замыкания для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (LoadFunc), ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ список ΠΊΠΎΠΌΠ°Π½Π΄, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π·Π½Π°ΠΊΠ° ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (LoadSect). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Apply ΠΈ Π΅Ρ‰Π΅ нСсколько Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄, смысл ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·ΡŠΡΡΠ½Π΅Π½ ΠΏΠΎΠ·ΠΆΠ΅.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, записанная Π½Π° ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠΌ языкС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ лямбдаисчислСния, сначала пСрСводится (компилируСтся) Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня. Π”Π°Π»Π΅Π΅, Ссли трСбуСтся ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, запускаСтся ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠΌΠ°Π½Π΄ SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ исходного тСкста — это обычная функция, которая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ Π²Ρ‹Π΄Π°Π΅Ρ‚ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° список ΠΊΠΎΠΌΠ°Π½Π΄. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠΌΠ°Π½Π΄ SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠΆΠ΅ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ‹ ΡΡ‚ΠΎ Π΄Π΅Π»Π°Π»ΠΈ для SECDΠΌΠ°ΡˆΠΈΠ½Ρ‹ высокого уровня, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅, Ρ‚Π°ΠΊΠΎΠ΅ описаниС Π±ΡƒΠ΄Π΅Ρ‚ нСдостаточным ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ потрСбуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Ρ‡ΠΈΡΡ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ…, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² ΡΠ΅Π±Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡƒΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ (присваиваниС). Как ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅, для энСргичной SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ это касаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ вычислСния значСния рСкурсивного Π±Π»ΠΎΠΊΠ°, Π° Π΄Π»Ρ Π»Π΅Π½ΠΈΠ²ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Ρ‚Π°ΠΊΠΎΠ΅ присваиваниС потрСбуСтся Π΅Ρ‰Π΅ ΠΈ Π΄Π»Ρ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Ρ… ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, вычислСниС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±Ρ‹Π»ΠΎ Π·Π°Π΄Π΅Ρ€ΠΆΠ°Π½ΠΎ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ обращСния ΠΊ Π½ΠΈΠΌ.

ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ Haskell для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ компилятора ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня. ВмСсто этого сдСлаСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… для прСдставлСния исходных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ (значСния Π² Π²ΠΈΠ΄Π΅ БЗНЀ) ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹. ПослС этого опишСм ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Π² Π²ΠΈΠ΄Π΅ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ компиляции comp. УравнСния Π±ΡƒΠ΄Π΅ΠΌ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π½Π΅Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΡ… Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ Haskell большого Ρ‚Ρ€ΡƒΠ΄Π° Π½Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚авляСт. НаконСц, опишСм Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ² ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ состояния SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… Π²ΠΈΠ΄ (s, Π΅, с, d) -" (s', Π΅', с', d').

Π³Π΄Π΅ (sf Π΅, с, d) прСдставляСт состояниС SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π΄ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, a (s', Π΅', cf, d?) — послС Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΡ€Π°Π²ΠΈΠ»Π° Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ зависят ΠΎΡ‚ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄, Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… Π² Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π΅ управлСния, ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ пСрСписаны Π² Π²ΠΈΠ΄Π΅ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ evaluate.

НачнСм с ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ исходного языка программирования. Π­Ρ‚ΠΎ описаниС практичСски ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ совпадаСт с ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ Ρ‚ΠΈΠΏΠ° Π•Ρ…Ρ€Π³, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ появилось Ρƒ Π½Π°Ρ Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ описании ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°. Π”ΠΎΠ±Π°Π²ΠΈΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ для прСдставлСния пустого списка Nil ΠΈ ΡΠ½ΠΎΠ²Π° Π²Π²Π΅Π΄Π΅ΠΌ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ для явного прСдставлСния условного выраТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈ чисто энСргичных вычислСниях. Π£ ΠΏΠ°Ρ получится ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ описаниС:

data Π•Ρ…Ρ€Π³ =.

Integral Integer I — цСлая константа.

Logical Bool I — логичСская константа.

Nil I — константа — пустой список.

Function String I — встроСнная функция.

Variable String I — пСрСмСнная.

Lambda String Π•Ρ…Ρ€Π³ | — лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

Application Expr Expr | — ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

If Expr Expr Expr | — условноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

Let String Expr Expr | — нСрСкурсивный Π±Π»ΠΎΠΊ.

Letrec [ (String, Expr)] Expr — рСкурсивный Π±Π»ΠΎΠΊ ВыраТСния Π² ΡΠ»Π°Π±ΠΎΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΉ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ прСдставлСны значСниями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ описания Ρ‚ΠΈΠΏΠ° ΠΈ Π΅Π³ΠΎ конструкторов:

data WHNF =.

Numeric Integer I — цСлая константа.

Boolean Bool I — логичСская константа.

List [WHNF] | — список (Π² Ρ‚ΠΎΠΌ числС — пустой).

Closure [Command] Context | — Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Section String Int [WHNF] — встроСнная функция ΠΈΠ»ΠΈ.

— Π΅Π΅ ΡΠ΅Ρ‡Π΅Π½ΠΈΠ΅ Π’ ΡΡ‚ΠΎΠΌ описании, ΠΊΠ°ΠΊ ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ, Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ прСдставлСния списка Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ список ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ значСния, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΡΠ·Ρ‹ΠΊΠ° Haskell, Π² Π½Π°ΡˆΠ΅ΠΌ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΌ лямбда-исчислСнии список ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ², соСдиняя Π² ΠΎΠ΄Π½ΠΎΠΌ спискС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ†Π΅Π»Ρ‹Π΅ числа, Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ списки ΠΈ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΡ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, для прСдотвращСния ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° ΠΈΠΌΠ΅Π½ конструкторов ΠΌΡ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ конструкторов, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… значСния Ρ†Π΅Π»ΠΎΠ³ΠΎ ΠΈ Π»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠΎΠ².

Π’Π΅ΠΏΠ΅Ρ€ΡŒ опишСм Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠΌΠ°Π½Π΄ SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв смысл ΠΊΠΎΠΌΠ°Π½Π΄ понятСн ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ ΠΈΠ»ΠΈ ясСн ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π°Π±Π·Π°Ρ†Π΅Π².

Бмысл Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ Π±ΡƒΠ΄Π΅Ρ‚ понятСн ΠΏΡ€ΠΈ рассмотрСнии Ρ€Π°Π±ΠΎΡ‚Ρ‹ SECDΠΌΠ°ΡˆΠΈΠ½Ρ‹:

Command =.

Load (Int, Int).

LoadConst WHNF.

LoadFunc [Command].

LoadSect String.

Select [Command].

Apply.

Return.

LetApply.

Dummy.

RecApply.

Stop.

data

| — Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° значСния ΠΏΠΎ Π°Π΄Ρ€Π΅ΡΠ½ΠΎΠΉ ΠΏΠ°Ρ€Π΅.

| — Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° констант.

| — Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° замыкания.

I — Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° встроСнной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ [Command] | — Π²Ρ‹Π±ΠΎΡ€ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹.

I — ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ | — Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

| — Π²Ρ…ΠΎΠ΄ Π² Π½Π΅Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ.

| — ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ контСкста.

| — Π²Ρ…ΠΎΠ΄ Π² Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ.

— ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π Π°Π±ΠΎΡ‚Ρƒ компилятора ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ compile, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ являСтся нСкоторая конструкция языка — Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Π•Ρ…Ρ€Π³, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ — ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄, получСнная компиляциСй исходного выраТСния. ΠšΡ€ΠΎΠΌΠ΅ исходного выраТСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ compile являСтся Ρ‚Π°ΠΊΠΆΠ΅ контСкст ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ компиляция выраТСния всСгда производится Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ контСкстС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Для упрощСния записи Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ функция compile прСдставлСна Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ (**), Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ наши уравнСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΈΠ΄ Π΅Ρ…Ρ€Π³ ** context = [список ΠΊΠΎΠΌΠ°Π½Π΄].

НапримСр, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (Integral ΠΏ) компилируСтся Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ†Π΅Π»ΠΎΠΉ константы, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

(Integral n) ** context = [LoadConst (Numeric n)].

Π’Π°ΠΊ ΠΆΠ΅ просто ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ уравнСния для компиляции Π΅Ρ‰Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… простых Ρ‚ΠΈΠΏΠΎΠ² выраТСния:

  • (Logical b) ** context = [LoadConst (Boolean b) ]
  • (Nil) ** context = [LoadConst (List [])]
  • (Function f) ** context = [LoadSect f]
  • (Variable x) ** context = [Load $ addr x context]

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ условноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π½ΡƒΠΆΠ½ΠΎ сначала ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для вычислСния условия, Π° Ρ‚Π°ΠΊΠΆΠ΅ для вычислСния ΠΎΠ±Π΅ΠΈΡ… Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ² условного выраТСния. ПослС этого ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Ρ€Π°ΡΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сначала Π±Ρ‹Π»ΠΎ вычислСно условиС, Π° ΠΏΠΎΡ‚ΠΎΠΌ исполнилась ΠΊΠΎΠΌΠ°Π½Π΄Π° Select, которая ΡƒΠΆΠ΅ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Ρ‚ Π²Ρ‹Π±ΠΎΡ€, ΠΊΠ°ΠΊΡƒΡŽ ΠΈΠ· Π΄Π²ΡƒΡ… ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ Π½Π°Π΄ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ записано ΠΊΠ°ΠΊ.

(If cond eThen eElse) ** context = (cond ** context) ++.

[Select (eThen ** context) (eElse ** context)] РазумССтся, компиляция всСх ΠΏΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ этого выраТСния производится Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ контСкстС.

НСмного слоТнСС выглядит ΠΊΠΎΠΌΠ°Π½Π΄Π° компиляции лямбда-выраТСния. Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Ρ‚Π΅Π»ΠΎ лямбдавыраТСния, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ Π² ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠΌ контСкстС, Π° Π² ΠΊΠΎΠ½Ρ‚СкстС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π½ΠΎΠ²Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, содСрТащий Π΅Π΄ΠΈΠ½ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ — Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ лямбда-выраТСния. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ контСкст прСдставляСт собой список ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ, Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊ Π½Π΅ΠΌΡƒ Π½ΠΎΠ²ΠΎΠ³ΠΎ уровня, содСрТащСго ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ…, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ выраТСния [Ρ…]: context. Π’ΠΎΠ³Π΄Π° всС ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ для прСдставлСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° компиляции лямбда-выраТСния ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

(Lambda Ρ… body) ** context.

[LoadFunc ((body ** ([x]: context)) ++ [Return])).

Ρ‚.Π΅. Ρ‚Π΅Π»ΠΎ лямбда-выраТСния компилируСтся Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΌ контСкстС, ΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ добавляСтся Π΅Ρ‰Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Return, ΠΈ Π²ΡΡ эта скомпилированная ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ являСтся СдинствСнным ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ LoadFunc.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ выраТСния, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ собой ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ, выполняСтся ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ СстСствСнным ΠΏΡ€ΠΈ энСргичных вычислСниях способом, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ: сначала Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ вычислСния значСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π·Π°Ρ‚Π΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (Π² ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌ случаС это Π±ΡƒΠ΄Π΅Ρ‚ СдинствСнная ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ), ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° Apply, которая ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»Π΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊ Π²Ρ‹Ρ‡ΠΈΡΠ»Π΅Π½Π½ΠΎΠΌΡƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρƒ. ВсС это ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ уравнСния:

  • (Application func arg) ** context =
  • (arg ** context) ++ (func ** context) ++ [Apply] ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΄Π²Π° самых слоТных уравнСния для компиляции Π±Π»ΠΎΠΊΠΎΠ² Let ΠΈ Letrec. Для компиляции Π±Π»ΠΎΠΊΠ° Let Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ вычислСниС этого Π±Π»ΠΎΠΊΠ° эквивалСнтно ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ‚Π΅Π»ΠΎ лямбда-выраТСния совпадаСт с Ρ‚Π΅Π»ΠΎΠΌ Π±Π»ΠΎΠΊΠ°, Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ являСтся Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, содСрТащССся Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Π±Π»ΠΎΠΊΠ°.

Π’Π΅Π»ΠΎ Π±Π»ΠΎΠΊΠ° скомпилируСм Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Ρ‚Π΅Π»ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ лямбда-выраТСния; контСкст для компиляции ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ соСдинСниСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π±Π»ΠΎΠΊΠ° с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ контСкстом. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, входящСС Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π±Π»ΠΎΠΊΠ°, компилируСтся Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ контСкстС. НаконСц, выполняСтся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Π²Ρ…ΠΎΠ΄ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

(Let Ρ… Π΅ body) ** context (Π΅ ** context) ++.

[LoadFunc ((body ** ([x]: context)) ++ [Return]), Apply].

ΠŸΡ€ΠΈ исполнСнии сгСнСрированной ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ сначала Π² ΡΡ‚Π΅ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, вычислСнноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π΅, Π·Π°Ρ‚Π΅ΠΌ Π² ΡΡ‚Π΅ΠΊ загрузится функция, Ρ‚Π΅Π»ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΎ Ρ‚Π΅Π»ΠΎΠΌ Π±Π»ΠΎΠΊΠ°, ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Apply.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ рСкурсивного Π±Π»ΠΎΠΊΠ° производится ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Однако ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ отличия. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, компиляция Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, входящих Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π±Π»ΠΎΠΊΠ°, производится Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ контСкстС, Ρ‡Ρ‚ΠΎ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Ρ‚Π΅Π»Π° Π±Π»ΠΎΠΊΠ°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΡΡ‚ΠΈΡ… выраТСниях допустимо ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ впослСдствии вычислСния происходили Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΌ контСкстС, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ контСкст Π΅Ρ‰Π΅ Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° вычислСний. Для этого Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Dummy. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ обращСния ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡΠΌ ΠΈΠ· ΡΡ‚ΠΎΠ³ΠΎ контСкста ΠΏΡ€ΠΈ вычислСнии Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π±Π»ΠΎΠΊΠ° ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Напомним, Ρ‡Ρ‚ΠΎ Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎΠ± ΡΠ½Π΅Ρ€Π³ΠΈΡ‡Π½Ρ‹Ρ… вычислСниях, Π³Π°ΠΊ Ρ‡Ρ‚ΠΎ любоС прямоС ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π±Π»ΠΎΠΊΠ° ΠΈΠ· Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π±Π»ΠΎΠΊΠ° Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ Π±Ρ‹ ΠΊ Π·Π°Ρ†ΠΈΠΊΠ»ΠΈΠ²Π°Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ содСрТатся Π² ΡΡ‚ΠΈΡ… выраТСниях Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Π΅Π» лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ контСкст ΠΏΠΎΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ, Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΠΈΠΉ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π’Ρ…ΠΎΠ΄ Π² Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ происходит Π² ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ контСкстом являСтся Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ контСкст, сформированный ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Dummy, поэтому ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ этого контСкста списком вычислСнных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²Ρ…ΠΎΠ΄Π° Π² Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ — RecApply.

ЗначСния Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, находящихся Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Π±Π»ΠΎΠΊΠ°, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΏΠΎΠΏΠ°ΡΡ‚ΡŒ Π² ΡΠΏΠΈΡΠΎΠΊ, поэтому Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ для вычислСния Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ формирования Ρ‚Π°ΠΊΠΎΠ³ΠΎ списка. НачинаСтся построСниС списка с ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π² ΡΡ‚Π΅ΠΊ пустого списка ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ LoadConst. Для присоСдинСния ΠΊ ΡΠΏΠΈΡΠΊΡƒ Π½ΠΎΠ²Ρ‹Ρ… элСмСнтов ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ стандартной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ CONS, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΠΌ Π² ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

  • (Letrec [(xl, el),…, (xn, en)] body) ** context [Dummy, LoadConst (List [])] ++
  • (en ** ([xlxn]: context)) ++

[LoadSect «CONS», Apply, Apply] ++.

(el ** ([xlxn]: context)) ++.

[LoadSect «CONS», Apply, Apply] ++.

[LoadFunc ((body ** ([xlxn]: context) + + [Return])] ++.

[RecApply].

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ компилятора Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½ΠΎ. Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ: нСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ уравнСния для компилятора Π±Ρ‹Π»ΠΈ Π΄Π°Π½Ρ‹ Π² Π½Π΅Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΌ Π²ΠΈΠ΄Π΅, ΠΈΡ… Π½Π΅ΡΠ»ΠΎΠΆΠ½ΠΎ пСрСвСсти Π² Ρ‡ΠΈΡΡ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Для ΠΏΠΎΠ»Π½ΠΎΡ‚Ρ‹ излоТСния ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ эту ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Π»ΠΈΡΡ‚ΠΈΠ½Π³Π΅ 12.1 Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ.

Листинг 12.1. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ лямбда-исчислСния import Data. List (findlndex).

— ΠžΡΠ½ΠΎΠ²Π½ΠΎΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… для прСдставлСния Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ — Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ лямбда-исчислСния ΠΈ «ΠΊΠΎΠΌΠ°Π½Π΄» SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ data Π•Ρ…Ρ€Π³ =.

Integral Integer I — цСлая константа.

Logical Bool I — логичСская константа.

Nil | — константа — пустой список.

Function String I — встроСнная функция.

Variable String I — пСрСмСнная.

Lambda String Expr | — лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

Application Expr Expr | — ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

If Expr Expr Expr | — условноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

Let String Expr Expr | — нСрСкурсивный Π±Π»ΠΎΠΊ.

Letrec [(String, Expr)] Expr — рСкурсивный Π±Π»ΠΎΠΊ deriving (Show, Eq).

data Command =.

Load (Int, Int) | — Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° значСния ΠΏΠΎ Π°Π΄Ρ€Π΅ΡΠ½ΠΎΠΉ ΠΏΠ°Ρ€Π΅.

LoadConst WHNF | — Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° константы.

LoadFunc [Command] I — Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° замыкания.

LoadSect String | — Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° встроСнной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

Select [Command] [Command] | — Π²Ρ‹Π±ΠΎΡ€ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹.

Apply I — ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Return I — Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

LetApply I — Π²Ρ…ΠΎΠ΄ Π² Π½Π΅Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ.

Dummy | — ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ контСкста.

RecApply | — Π²Ρ…ΠΎΠ΄ Π² Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ.

Stop — остановка Ρ€Π°Π±ΠΎΡ‚Ρ‹.

deriving (Show, Eq).

— «Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ вычислСний» data WHNF =.

Numeric Integer I.

Boolean Bool I.

List [WHNF] |.

Closure [Command] Context |.

Section String Int [WHNF].

deriving (Show, Eq).

  • — ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ Ρ‚ΠΈΠΏΠΎΠ² основных ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ type Context = [ [String]]
  • —— ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€:

compile:: Expr -> [Command].

(***): Expr -> Context -> [Command].

comp:: [ [String] ] -> Expr -> [Command] -> [Command].

compile = (*** []).

e *** context = comp context e [Stop].

— Π’ычислСниС адрСсной ΠΏΠ°Ρ€Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ контСкстС ΠΈΠΌΠ΅Π½ addr: Eq, Π° => Π° -> [[Π°]] -> (Int, Int).

addr var (vars:rest) = case findlndex (== var) vars of Nothing -> (lev+1, num).

Just idx -> (0, idx).

where (lev, num) = addr var rest.

comp env (Integral n) lc = (LoadConst (Numeric n)) :1c.

comp env (Logical b) lc = (LoadConst (Boolean b)) :1c.

comp env Nil lc = (LoadConst (List [])): lc.

comp env (Function f) lc = (LoadSect f): lc.

comp env (Variable x) lc = (Load (addr x env)): lc.

comp env (Lambda var e) lc =.

  • (LoadFunc (comp ([var]: env) e [Return])): lc comp env (Application func arg) lc =
  • ((comp env arg). (comp env func)) (Apply:lc) comp env (If cond th el) lc = comp env cond
  • ((Select (comp env th []) (comp env el [])):lc) comp env (Let x e body) lc = comp env e
  • ((LoadFunc (comp ([x]: env) body [Return])): Apply: lc) comp env (Letrec pairs body) lc =

Dummy: (LoadConst (List [])) :

  • (foldr (comp' env)
  • ((LoadFunc (comp (names:env) body [Return])): RecApplyilc) (reverse values))

where (names, values) = unzip pairs comp' e ex lc =.

comp e ex ((LoadSect «cons»):Apply:Apply:lc).

Π’ ΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ основная Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΠΈ выраТСния выполняСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ comp, которая для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ эффСктивности ΠΈΠΌΠ΅Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ — ΡƒΠΆΠ΅ сформированный список ΠΊΠΎΠΌΠ°Π½Π΄. Π­Ρ‚ΠΎ позволяСт ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Π½Π΅ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ соСдинСния списков ΠΊΠΎΠΌΠ°Π½Π΄ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (++), ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ использовали Π² Π½Π°ΡˆΠ΅ΠΌ Π½Π΅Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΌ описании компилятора.

МоТно ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ получаСтся послС компиляции ΠΊΠ°ΠΊΠΎΠ³ΠΎΠ½ΠΈΠ±ΡƒΠ΄ΡŒ выраТСния Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ лямбда-исчислСния. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

let twice = Xf.Xx.f (f x) in twice (+ 1) 3.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ этого выраТСния Π² Π²ΠΈΠ΄Π΅ значСния Ρ‚ΠΈΠΏΠ° Π•Ρ…Ρ€Π³ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ: test: Π•Ρ…Ρ€Π³ test = Let «twice» .

  • (Lambda «f» (Lambda «x»
  • (Application (Variable «f»)
  • (Application (Variable «f»)(Variable «x»)))))
  • (Application
  • (Application (Variable «twice»)
  • (Application (Function «+»)(Integral 1))) (Integral 3))

Запустим наш компилятор, Π·Π°Π΄Π°Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ GIIC Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ compile test. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ (для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ со ΡΡ‚Ρ€ΠΎΠΊΠΈ Π½Π° ΡΡ‚Ρ€ΠΎΠΊΡƒ):

" compile test [LoadFunc.

[LoadFunc.

[Load (0,0), Load (1,0), Apply, Load (1,0), Apply, Return],.

Return],.

LoadFunc.

[LoadConst (Numeric 3), LoadConst (Numeric 1),.

LoadSect «+», Apply, Load (0,0), Apply, Apply, Return],.

Apply, Stop].

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ сгСнСрированная ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ прСдставляСт исполняСмый ΠΊΠΎΠ΄ для прСобразования нашСго выраТСния Π² Π‘ЗНЀ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹ SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня. Π•Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π½Π΅Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ исполнСния ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ², ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΡ… состояниС рСгистров ΠΌΠ°ΡˆΠΈΠ½Ρ‹. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ происходит ΠΏΠΎΠ΄ воздСйствиСм ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ· Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π° управлСния. ПослСднСй исполняСмой ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Π° остановки ΠΌΠ°ΡˆΠΈΠ½Ρ‹ — Stop.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ всю Ρ€Π°Π±ΠΎΡ‚Ρƒ SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ чисто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ составляСт ΠΊΠΎΠΌΠ°Π½Π΄Π° RecApply, которая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ присваиваниС Π² ΠΊΠΎΠ½Ρ‚СкстС — ΠΏΠΎΠ΄ΠΌΠ΅Π½Ρƒ Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ пустого списка Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π° Π²Ρ‹Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹ΠΉ список. Π—Π΄Π΅ΡΡŒ снова сущСствСнно, Ρ‡Ρ‚ΠΎ происходит ΠΈΠΌΠ΅Π½Π½ΠΎ Π·Π°ΠΌΠ΅Π½Π° значСния, Π° Π½Π΅ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ списка, ΠΊΠ°ΠΊ это происходит Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ этот Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ контСкст ΡƒΠΆΠ΅ ΠΌΠΎΠ³ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΠΎΠΌΠ½Π΅Π½ Π² Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΡΡ… для лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Π±Π»ΠΎΠΊΠ°. Π—Π°ΠΌΠ΅Π½Π° значСния Π΄ΠΎΠ»ΠΆΠ½Π° привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ всС ссылки Π½Π° ΡΡ‚ΠΎΡ‚ контСкст Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ЀактичСски исполнСниС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ RecApply ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡŽ цикличСского контСкста, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ элСмСнты содСрТат ссылку Π½Π° ΡΠ΅Π±Ρ.

Π‘Π½Π°Ρ‡Π°Π»Π° опишСм, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ простыС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‰ΠΈΠ΅ Π² ΡΡ‚Π΅ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Ρ‚Π΅ ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹Π΅ значСния:

  • (s, ctx, (LoadConst val):c, d) -" (val:s, ctx, c, d)
  • (s, ctx, (Load addr):c, d) -" ((getValue addr ctx):s, ctx, c, d)
  • (s, ctx, (LoadFunc corns) :c, d) —> ((Closure corns ctx): s, ctx, c, d)
  • (s, ctx, (LoadSect f) :c, d) —" ((Section f (arity f)

[]): s, ctx, c, d).

ВсС эти ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ понятны — Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΠ»ΠΈ контСкста просто пСрСносится Π½Π° ΡΡ‚Π΅ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, нСсколько видоизмСняясь. Π’Π°ΠΊ, ΠΏΡ€ΠΈ исполнСнии ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ LoadFunc Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΡΡ‚Π΅ΠΊ помСщаСтся Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅, ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρƒ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ контСкста. ΠŸΡ€ΠΈ исполнСнии ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ LoadSect формируСтся пустой список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΈ Ρ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ arity вычисляСтся количСство Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ функция ΠΌΠΎΠ³Π»Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ. Напомним, Ρ‡Ρ‚ΠΎ функция getValue Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Π΄Π²ΡƒΡ…ΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ списка Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ адрСсной ΠΏΠ°Ρ€Π΅.

Команда Select Ρ‚ΠΎΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ достаточно просто, ΠΎΠ΄Π½Π°ΠΊΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ зависит ΠΎΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡ, находящСгося Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка. ИсполнСниС Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΌΡ‹ ΠΎΠΏΠΈΡˆΠ΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π²ΡƒΡ… ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ², ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π΄Π²ΡƒΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ значСниям, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅Π΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ:

((Boolean True) :s, ctx, (Select th el):c, d) -> (s, ctx, th ++ c, d) ((Boolean False) :s, ctx, (Select th el):c, d) —> (s, ctx, el ++ c, d).

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ списку ΠΊΠΎΠΌΠ°Π½Π΄ рСгистра управлСния добавляСтся ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΄Π²ΡƒΡ… списков ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈΠ· ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅ΠΉΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Select. Π’Π΅ΠΏΠ΅Ρ€ΡŒ опишСм ΠΏΠ°Ρ€Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄ для исполнСния Π²Ρ…ΠΎΠ΄Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Π½Π΅Π΅ — ΠΊΠΎΠΌΠ°Π½Π΄ Apply ΠΈ Return. Π’ ΡΠ»ΡƒΡ‡Π°Π΅ ΠΊΠΎΠ³Π΄Π° функция, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ происходит Π²Ρ…ΠΎΠ΄, прСдставлСна Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΠΌΠ°Π½Π΄Π° Apply просто сохраняСт Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π² Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π΅ хранСния состояний, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ контСкст ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ°ΡˆΠΈΠ½Ρƒ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°:

  • ((Closure corns env):arg:s, ctx, Apply: c, d) ->
  • ([], [arg] :env, corns, (s, ctx, c) :d)

Π Π°Π±ΠΎΡ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Apply Π² ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΠ³Π΄Π° исполняСмая функция прСдставлСна сСчСниСм, зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, являСтся Π»ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ послСдним Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ. Если Π΄Π°, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вычисляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ intrinsic, которая, ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅, выполняСт дСйствия ΠΏΠΎ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ встроСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Если Π½Π΅Ρ‚, Ρ‚ΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ просто добавляСтся Π² ΡΠΏΠΈΡΠΎΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² сСчСния. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ€Π°Π±ΠΎΡ‚Π° этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ описана с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π΄Π²ΡƒΡ… ΠΏΡ€Π°Π²ΠΈΠ» ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° (Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ· ΡΡ‚ΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ» подразумСваСтся, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏ Π±ΠΎΠ»ΡŒΡˆΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹):

  • ((Section f 1 list):arg:s, ctx, Apply: c, d) -«
  • ((intrinsic f (list ++ [arg])):s, ctx, c, d) ((Section f n list):arg:s, ctx, Apply: c, d) —>
  • ((Section f (n-1) (list ++ [arg])):s, ctx, c, d) Команда Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ просто восстанавливаСт сохранСнноС Ρ€Π°Π½Π΅Π΅ состояниС SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹, пСрСнося Π² ΡΡ‚Π΅ΠΊ вычислСнноС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:
  • (val:s', ctx', Return: c', (s, ctx, c) :d) —> (val:s, ctx, c, d) Π‘Π°ΠΌΠΎΠΉ слоТной являСтся ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²Ρ…ΠΎΠ΄Π° Π² Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ. ΠŸΡ€ΠΈ вычислСнии рСкурсивного Π±Π»ΠΎΠΊΠ°, ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Dummy образуСтся Ρ„ΠΈΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ контСкст. Он Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ сохранСн Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ области памяти, Π° Π² SECD-машинС Π±ΡƒΠ΄Π΅Ρ‚ прСдставлСн «ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎΠΉ» ссылкой Π½Π° ΡΡ‚ΠΎΡ‚ контСкст. Π’ Π½Π°ΡˆΠ΅ΠΌ описании Ρ€Π°Π±ΠΎΡ‚Ρ‹ SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ эту ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π² Π²ΠΈΠ΄Π΅ «ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ» значСния link#context. ΠŸΡ€ΠΈ исполнСнии ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ RecApply этот контСкст являСтся Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ, Π½ΠΎ ΠΎΠ½ ΠΆΠ΅ ΠΌΠΎΠ³ Π±Ρ‹Ρ‚ΡŒ сохранСн Π²ΠΎ Π²ΡΠ΅Ρ… замыканиях, ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ вычислСнии Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π±Π»ΠΎΠΊΠ°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΊΠΎΠΌΠ°Π½Π΄Π° RecApply, работая с ΡΠΎΡ…Ρ€Π°Π½Π΅Π½Π½Ρ‹ΠΌ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ области памяти контСкстом, фактичСски подмСняСт сразу Π²ΠΎ Π²ΡΠ΅Ρ… экзСмплярах этого контСкста ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт Π½Π° ΡΠΏΠΈΡΠΎΠΊ вычислСнных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π‘ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΎΠ΄Π΅Π»Ρ‹Π²Π°Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ функция replace, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹Π·ΠΎΠ²Π° (replace args link# ([] :ctx)) Π½Π΅ ΠΏΡ€ΠΎΡΡ‚ΠΎ образуСтся Π½ΠΎΠ²Ρ‹ΠΉ контСкст link# (args: ctx), Π½ΠΎ Ρ„актичСски Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ ΠΈ Π²ΡΠ΅ Ρ€Π°Π½Π΅Π΅ сохранСнныС экзСмпляры этого контСкста, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Ρ‚Ρƒ ΠΆΠ΅ ΡΠ°ΠΌΡƒΡŽ ΠΌΠ΅Ρ‚ΠΊΡƒ:
  • (s, ctx, Dummy: c, d) —> (s, link# ([]: ctx), c, d)
  • ((Closure commands link#([]: ctx)):(List args):s,

link#([]: ctx), RecApply: c, d) —> ([], (replace args link#([]: ctx)), commands, (s, ctx, c) :d).

Для ΠΏΠΎΠ»Π½ΠΎΡ‚Ρ‹ излоТСния ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ привСсти Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ для исполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ остановки Stop. Π€ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

(s, ctx, Stop: c, d) —> (s, ctx, c, d).

ЀактичСски состояниС SECD-ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Π½Π΅ ΠΌΠ΅Π½ΡΠ΅Ρ‚ся, ΠΈ ΠΎΠ½Π° просто останавливаСт свою Ρ€Π°Π±ΠΎΡ‚Ρƒ.

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π»ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ способы Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π² Ρ‚ΠΎΠΌ числС построСниС ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π΅Π΅ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π° Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ языкС программирования (языкС, построСнном Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ исполнСнии ΠΊΠΎΠΌΠ°Π½Π΄), исполняСмом ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ SECD-машиной. Π’Π΅ΠΌ самым ΠΌΡ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ языки программирования Π²Ρ‹Ρ€Π°Π·ΠΈΠΌΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… срСдств ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ исполнСния. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‰ΡƒΡŽΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ эквивалСнтной Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ‹ Π·Π°ΠΉΠΌΠ΅ΠΌΡΡ построСниСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, написанной Π½Π° Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΌ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ языкС программирования.

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ