Scheme (язык программирования). ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° языка Scheme

Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ языка программирования своё Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Одни прСкрасно подходят для Π²Π΅Π±Π°, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ для дСсктопных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ… нуТдаСтся Data Science, Π° Π΅ΡΡ‚ΡŒ языки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ идСально подходят для знакомства с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. ΠœΡ‹ ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΏΡ€ΠΎ Logo, ΠΏΡ€ΠΎ Scratch, ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° Π±ΠΎΠ»Π΅Π΅ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ ΡΡ‚ΡƒΠΏΠ΅Π½ΡŒ образования ΠΈ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒ вас с Scheme.

ΠšΡ€Π°Ρ‚ΠΊΠ°Ρ справка

Π’ ΠΊΠΎΠ½Ρ†Π΅ 60-Ρ… Π³ΠΎΠ΄ΠΎΠ² 20 Π²Π΅ΠΊΠ° ΡƒΡ‡Π΅Π½Ρ‹Π΅ ΠœΠ°ΡΡΠ°Ρ‡ΡƒΡΠ΅Ρ‚ΡΠΊΠΎΠ³ΠΎ тСхнологичСского института Π“Π°ΠΉ Π‘Ρ‚ΠΈΠ» (Guy Steele) ΠΈ Π”ΠΆΠ΅Ρ€Π°Π»ΡŒΠ΄ БассмСн (Gerald Sussman) приступили ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ Π΄ΠΈΠ°Π»Π΅ΠΊΡ‚Π° языка Lisp. Они Ρ…ΠΎΡ‚Π΅Π»ΠΈ лишь Π΅Π³ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ, Π² Ρ‚ΠΎΠΌ числС слоТности синтаксиса ΠΈ Π½Π΅ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° ΠΏΡ€ΠΎΡ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования.

Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΡƒΡ‡Π΅Π½Ρ‹Π΅ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈ Ρ†Π΅Π»ΡƒΡŽ ΡΠ΅Ρ€ΠΈΡŽ Π·Π°ΠΌΠ΅Ρ‚ΠΎΠΊ, Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΠ²ΡˆΠΈΡ… Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ 1980 Π³ΠΎΠ΄Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠΏΠΈΡΡ‹Π²Π°Π»ΠΈΡΡŒ ΠΈΠ΄Π΅ΠΈ лямбда-вычислСний, хвостовой рСкурсии ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°. ПозднСС ΠΎΠ½ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Lambda Papers ΠΈ стали ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² запуска Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования Π² массы.

На основС описанных ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ ΠΈ появился язык Scheme, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ с нСбольшими Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠ°ΠΌΠΈ Π΄ΠΎΠΆΠΈΠ» Π΄ΠΎ сСгодняшнСго дня.

Бинтаксис

ΠŸΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ ΠΌΡ‹ рассмотрим синтаксис, Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π’ΠΈΠΊΠΈΡƒΡ‡Π΅Π±Π½ΠΈΠΊ ΠΏΠΎ Scheme . Π—Π΄Π΅ΡΡŒ просто ΠΈ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ выглядят Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, конструкции ΠΈ собствСнно сам ΠΊΠΎΠ΄. ΠœΠ°ΡΡ‚Π΅Ρ€ΠΎΠΌ Scheme с Π²ΠΈΠΊΠΈΡƒΡ‡Π΅Π±Π½ΠΈΠΊΠΎΠΌ Π²Ρ‹ Π½Π΅ станСтС, Π½ΠΎ вряд Π»ΠΈ это Π½ΡƒΠΆΠ½ΠΎ.

    ΠšΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки. Π›ΡŽΠ±ΠΎΠ΅ Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ Π² Π½ΠΈΡ…. Π­Ρ‚ΠΎ ΠΎΡ‚ΠΏΡƒΠ³ΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π²ΠΈΠ΄ΠΈΡ‚ ΠΊΠΎΠ΄ Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅, Π½ΠΎ впослСдствии Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ слоТностСй.

    Никаких Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… слуТСбных символов. Π₯Π²Π°Ρ‚ΠΈΡ‚ скобок. Π’ΠΎΡ‡ΠΊΠ° с запятой, кстати, отдСляСт ΠΎΡ‚ ΠΊΠΎΠ΄Π° ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ.

    ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ конструкций ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ «дСйствиС-ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Β». Π’ языкС программирования это смотрится Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Π½ΠΎ Π² ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅ Π½Π° СстСствСнный язык Π²ΠΏΠΎΠ»Π½Π΅ понятно.

Π’ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ, с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния синтаксиса - классичСский ΡƒΠΏΡ€ΠΎΡ‰Ρ‘Π½Π½Ρ‹ΠΉ язык программирования. ВзглянитС Π½Π° простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ вычислСния Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π°:

(define (factorial n)
(if (= n 0)
1
(* n (factorial (- n 1)))))

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΊΡ€ΠΎΠΌΠ΅ порядка записи ΠΈ большого количСства скобок, Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ.

Π“Π΄Π΅ примСняСтся

Scheme изучаСтся Π² амСриканских ΡˆΠΊΠΎΠ»Π°Ρ… ΠΈ Π²ΡƒΠ·Π°Ρ…. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ студСнты ΠΏΠΎΠ·Π½Π°ΡŽΡ‚ Π°Π·Ρ‹ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π½ΠΎΠ³ΠΎ программирования, Ρ‚Π°ΠΊ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ. Ни с ΠΊΠ°ΠΊΠΈΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ языком Ρ‚Π°ΠΊΠΎΠΉ фокус ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ получится.

А Π²ΠΎΡ‚ Π² ΠΆΠΈΠ·Π½ΠΈ послС ΡƒΡ‡Π΅Π±Ρ‹ Scheme Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ области примСнСния. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ это продолТСния студСнчСских ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², нСбольшиС куски ΠΊΠΎΠ΄Π° ΠΈ ΠΏΡ€ΠΎΠ±Π½Ρ‹Π΅ Ρ€Π΅Π»ΠΈΠ·Ρ‹. ΠŸΡ€ΠΈΡ‡ΠΈΠ½ нСпопулярности нСсколько:

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, Π·Π°Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ дСньги языком Scheme вСсьма ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ.

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

ΠŸΠ΅Ρ€ΡΠΏΠ΅ΠΊΡ‚ΠΈΠ²Ρ‹

НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Scheme Π½Π°ΡˆΡ‘Π» сСбя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΎΠ½ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ‚ΠΎΠΏ-50 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³Π° TIOBE . Но Π΅ΡΡ‚ΡŒ нСгативная тСндСнция - язык Π΅ΠΆΠ΅Π³ΠΎΠ΄Π½ΠΎ тСряСт 0,05% популярности. Π’Ρ‹Π·Π²Π°Π½ΠΎ это появлСниСм ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚ΠΎΠ², ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹Ρ… для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… большС возмоТностСй для примСнСния Π² ΠΆΠΈΠ·Π½ΠΈ, ΠΈ ΠΏΡ€ΠΈ этом простых.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Π΅Π»ΠΈΠΊΠ° Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‡Π΅Ρ€Π΅Π· 5-10 Π»Π΅Ρ‚ язык ΠΏΡ€ΠΎΠΏΠ°Π΄Ρ‘Ρ‚ с Ρ€Π°Π΄Π°Ρ€ΠΎΠ², Π° Π΅Π³ΠΎ мСсто Π·Π°ΠΉΠΌΡ‘Ρ‚ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Scratch. Но ΠΏΠΎΠΊΠ° этого Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΡƒΠ΄Π΅Π»ΠΈΠΌ нСсколько ΠΌΠΈΠ½ΡƒΡ‚ своСй ΠΆΠΈΠ·Π½ΠΈ знакомству с Scheme. Π‘Π²ΠΎΠ΅ΠΉ 47-Π»Π΅Ρ‚Π½Π΅ΠΉ историСй ΠΎΠ½ это заслуТил.

Π―Π·Ρ‹ΠΊ Scheme Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ достаточно Ρ…ΠΎΡ€ΠΎΡˆΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Emacs. Π­Ρ‚Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° рСализуСтся Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ рСализациями этого языка (scheme-mode , cmuscheme , quack ), Ρ‚Π°ΠΊ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (xscheme , gds , bee-mode , gambit ). Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… рСализация ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько большС возмоТностСй ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ всСх Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ.

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

Scheme-mode

Scheme-mode поставляСмый Π² поставкС дистрибутивов Emacs являСтся ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠ΅ΠΉ lisp-mode для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с исходным ΠΊΠΎΠ΄ΠΎΠΌ Π½Π° языкС Scheme. Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ:

  • подсвСтку синтаксиса
  • расстановку отступов
  • подсвСтку ΠΏΠ°Ρ€Π½Ρ‹Ρ… скобок

На Π±Π°Π·Π΅ scheme-mode создано нСсколько Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² β€” , ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‚ Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для выполнСния ΠΊΠΎΠ΄Π° прямо ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π° Emacs, ΠΈ Ρ‚.ΠΏ. Π²Π΅Ρ‰Π΅ΠΉ.

Π”Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ автоматичСски для Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… стандартныС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ для Ρ„Π°ΠΉΠ»ΠΎΠ² с исходными тСкстами Π½Π° Scheme β€” .scm , .ss ΠΈ Ρ‚.ΠΏ. Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ для Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ², Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² свой Ρ„Π°ΠΉΠ» ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ (Π·Π°ΠΌΠ΅Π½ΠΈΠ².scm Π½Π° Π½ΡƒΠΆΠ½ΠΎΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅):

(add-to-list "auto-mode-alist "("\\.scm$" . scheme-mode))

Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая Π±ΡƒΠ΄ΡƒΡ‡ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ scheme-mode-hook , Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Ρ€Π΅ΠΆΠΈΠΌΠ° Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ Π±ΡƒΡ„Π΅Ρ€Π΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· стандартныС срСдства настройки. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Π³Ρ€ΡƒΠΏΠΏΠ° настройки называСтся scheme .

Cmuscheme

ΠŸΠ°ΠΊΠ΅Ρ‚ cmuscheme Π±Ρ‹Π» написан Olin Shivers ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄, Π½ΠΎ Π΄ΠΎ сих ΠΏΠΎΡ€ являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· основных ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Ρƒ со Scheme. Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ языка Scheme. ВзаимодСйствиС с ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ рСализуСтся Π·Π° счСт использовании возмоТностСй ΠΏΠ°ΠΊΠ΅Ρ‚Π° comint , входящСго Π² поставку Emacs.

Настройка ΠΏΠ°ΠΊΠ΅Ρ‚Π°

Настройка ΠΏΠ°ΠΊΠ΅Ρ‚Π° достаточно проста β€” помСститС Π² свой Ρ„Π°ΠΉΠ» ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄

(autoload "run-scheme "cmuscheme" "Run an inferior Scheme" t) (setq scheme-program-name "mzscheme" )

ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ автоматичСски Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ запускС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ run-scheme . Вторая строка Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для указания ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Scheme, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π° свой Π»ΡŽΠ±ΠΈΠΌΡ‹ΠΉ Π΄ΠΈΠ°Π»Π΅ΠΊΡ‚. ВсС настройки Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Ρ‚Π°ΠΊΠΆΠ΅ доступны для ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ настройки Ρ‡Π΅Ρ€Π΅Π· Π³Ρ€ΡƒΠΏΠΏΡƒ настройки cmuscheme .

Π’ Π±ΡƒΡ„Π΅Ρ€Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, создаваСмом ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ β€” inferior-scheme-mode , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ…ΡƒΠΊ inferior-scheme-mode-hook . ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ссли сущСствуСт Ρ„Π°ΠΉΠ» ~/.emacs_SCHEMENAME ΠΈΠ»ΠΈ ~/.emacs.d/init_SCHEMENAME.scm (Π³Π΄Π΅ SCHEMENAME β€” Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°), Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ сразу послС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°.

Π Π°Π±ΠΎΡ‚Π° с ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ

Основной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚Π° являСтся функция run-scheme , которая запускаСт Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ языка Scheme ΠΈ позволяСт ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π½Π΅ покидая Emacs.

ΠŸΡ€ΠΈ этом Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ‚Π΅ΠΌ, какая Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° (Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅) Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° ΠΏΡƒΡ‚Π΅ΠΌ использования Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ β€” функция scheme-send-definition (сочСтания клавиш C-c C-e ΠΈΠ»ΠΈ C-M-x) ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ для выполнСния ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅; функция scheme-send-region (C-c C-r) позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ кусок исходного ΠΊΠΎΠ΄Π°; функция scheme-send-last-sexp (C-x C-e) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для вычислСния выраТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ находится ΠΏΠ΅Ρ€Π΅Π΄ курсором; Π° функция scheme-load-file (C-c C-l) позволяСт Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π² ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Ρ„Π°ΠΉΠ» Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ (ΠΎΠ½Π° позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ ΠΈΠ· любого Ρ„Π°ΠΉΠ»Π°, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π°).

Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Scheme выполняСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ Π±ΡƒΡ„Π΅Ρ€Π΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ *scheme* , ΠΊΡƒΠ΄Π° Ρ‚Π°ΠΊΠΆΠ΅ выводятся ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ вычислСния Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Для быстрого ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² этот Π±ΡƒΡ„Π΅Ρ€ ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π° с исходным тСкстом, сущСствуСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ функция switch-to-scheme (C-c C-z). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ часто трСбуСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ ΠΈ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, Ρ‚ΠΎ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ ΠΊΠΎΠ΄ для выполнСния, ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π² Π±ΡƒΡ„Π΅Ρ€ *scheme* β€” scheme-send-definition-and-go (C-c M-e) для вычислСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ опрСдСлСния ΠΈ scheme-send-region-and-go (C-c M-r) для вычислСния Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ исходного ΠΊΠΎΠ΄Π°.

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с макросами ΠΏΠ°ΠΊΠ΅Ρ‚ прСдоставляСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ scheme-expand-current-form (C-c C-x), которая позволяСт Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ макроса Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π½Π° Scheme. РаскрытиС ΠΊΠΎΠ΄Π° производится ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈ выводится Π² Π±ΡƒΡ„Π΅Ρ€ *scheme* . А ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с рСализациями Scheme, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ исходного ΠΊΠΎΠ΄Π°, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ функциями scheme-compile-file (C-c C-k) ΠΈ scheme-compile-definition (C-c M-c), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ соотвСтствСнно Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ опрСдСлСния.

Как ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, Π² Π±ΡƒΡ„Π΅Ρ€Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° дСйствуСт ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ β€” inferior-scheme-mode Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ всС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Ρ€Π΅ΠΆΠΈΠΌΠ° comint , Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ cmuscheme β€” scheme-compile-file (C-c C-k), scheme-load-file (C-c C-l), scheme-send-last-sexp (C-x C-e) ΠΈ scheme-send-definition (C-M-x).

Quack

ΠŸΠ°ΠΊΠ΅Ρ‚ Quack являСтся Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ для ΠΏΠ°ΠΊΠ΅Ρ‚Π° cmuscheme ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возмоТности (ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· Π½ΠΈΡ… Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ относятся ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅ с PLT Scheme):

  • мСню, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ языку, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ ΠΈ SRFI, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ поиска описания для ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, находящСгося Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ курсора;
  • Π½ΠΎΠ²Ρ‹Π΅ Π½Π°Π±ΠΎΡ€Ρ‹ подсвСтки для font-lock β€” для PLT Scheme ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ, для Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ;
  • Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования грСчСского символа lambda для обозначСния lambda-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π½ΠΈΠΆΠ΅);
  • Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для вставки ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… скобок;
  • Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ для ΠΏΡ€Π°Π²ΠΈΠ» расстановки отступов, с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ настройки для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠ² Scheme;
  • Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ вСрсия ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ run-scheme , которая Π·Π½Π°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ популярных ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠ² Scheme, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ послСдний Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°;
  • Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ вСрсия ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ switch-to-scheme ;
  • Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ просмотра содСрТимого.plt ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для открытия Π±ΡƒΡ„Π΅Ρ€Π° Dired для Π½ΡƒΠΆΠ½ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ.

Установка ΠΈ настройка

ΠŸΠ°ΠΊΠ΅Ρ‚ написан Neil Van Dyke, ΠΈ доступСн для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ с сайта Π°Π²Ρ‚ΠΎΡ€Π° . ΠŸΠ°ΠΊΠ΅Ρ‚ устанавливаСтся ΠΏΡƒΡ‚Π΅ΠΌ копирования Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π³Π΄Π΅ Emacs смоТСт Π½Π°ΠΉΡ‚ΠΈ Π΅Π³ΠΎ, ΠΈ загруТаСтся ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

(require "quack )

ВсС настройки ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π³Ρ€ΡƒΠΏΠΏΡƒ настройки quack , ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ мСню Quack . Π­Ρ‚ΠΈ настройки Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² сСбя адрСса руководств ΠΈ SRFI, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ прСфиксного сочСтания клавиш, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ ΠΈ Ρ‚.ΠΏ.

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ PLT Scheme рСкомСндуСтся ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ руководства ΠΏΠΎ Π΄Π°Π½Π½ΠΎΠΌΡƒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ с сайта ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΡ… Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ doc . НахоТдСниС ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ PLT Scheme опрСдСляСтся Π»ΠΈΠ±ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ quack-pltcollect-dirs , Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ всС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ с Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌΠΈ коллСкциями, Π»ΠΈΠ±ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ срСды PLTHOME ΠΈ/ΠΈΠ»ΠΈ PLTCOLLECTS .

Π’Π°ΠΊΠΆΠ΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠ°ΠΊΠ΅Ρ‚Π° трСбуСтся Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ wget , которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для доступа ΠΊ SRFI.

Π Π°Π±ΠΎΡ‚Π° с ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ

ПослС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ функциям cmuscheme ΠΈ scheme-mode становятся доступными Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ стандартныС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ (сочСтания клавиш ΠΈ/ΠΈΠ»ΠΈ запуск ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ), Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ мСню Quack .

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Ѐункция quack-view-manual (C-c C-q m) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для просмотра Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π² Π²Π΅Π±-Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅. Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° позволяСт ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π±Π°Π·ΠΎΠ²ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ языку Scheme, Ρ‚Π°ΠΊ ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ рСализациям. Для просмотра SRFI ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° β€” quack-view-srfi (C-c C-q s), которая Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π΅Π³ΠΎ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅. А для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ PLT Scheme Π΅Ρ‰Π΅ доступна ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° quack-view-keyword-docs (C-c C-q k), которая ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ для Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова (Ρ€Π°Π±ΠΎΡ‚Π° этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ зависит ΠΎΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ установки Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ PLT Scheme ).

Как ΡƒΠΆΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π»ΠΎΡΡŒ Π²Ρ‹ΡˆΠ΅, ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° функция run-scheme (C-c C-q r), которая позволяСт Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρ‹ языка Scheme, выбирая ΠΈΡ… ΠΈΠ· списка извСстных (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ запуск с Π½ΡƒΠΆΠ½Ρ‹ΠΌΠΈ опциями), Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ послСдний Π²Ρ‹Π±ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ PLT Scheme Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΡƒΠ΄ΠΎΠ±Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с коллСкциями. Ѐункция quack-find-file (C-c C-q f) ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ», ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ контСкста для получСния ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°. НапримСр, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ курсор находится Π½Π° ΠΊΠΎΠ΄Π΅ (require (lib "list.ss")) , Ρ‚ΠΎ Π²Π°ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» list.ss ΠΈΠ· ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ mzlib . ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° функция quack-dired-pltcollect , которая позволяСт ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ Dired для Π½ΡƒΠΆΠ½ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ PLT Scheme (ΠΏΡ€ΠΈ Π·Π°Π΄Π°Π½ΠΈΠΈ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π²Ρ‚ΠΎΠ΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ).

Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, дСлая Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ для использования. Ѐункция quack-tidy-buffer (C-c C-q t) Π·Π°Π½ΠΎΠ²ΠΎ расставляСт отступы Π² ΠΊΠΎΠ΄Π΅, замСняСт Π·Π½Π°ΠΊΠΈ табуляции Π½Π° ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹, удаляСт лишниС пустыС строки, удаляСт Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π΅Π»ΡŒΠ½Ρ‹Π΅ символы Π² строках, Π° Ρ‚Π°ΠΊΠΆΠ΅ добавляСт Π·Π½Π°ΠΊ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ„Π°ΠΉΠ»Π°, Ссли Π΅Π³ΠΎ Π½Π΅Ρ‚. Ѐункция quack-toggle-lambda (C-c C-q l) измСняСт объявлСниС Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с (define (func args) ...) Π½Π° (define func (lambda (args) ..)) , Ρ‡Ρ‚ΠΎ позволяСт ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π·Π½Π°ΠΊ лямбда Π² ΠΊΠΎΠ΄Π΅ (ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ отобраТСния Π΄Π°Π½Π½ΠΎΠ³ΠΎ символа). НапримСр, Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

ΠŸΠ°ΠΊΠ΅Ρ‚ GCA

GCA β€” ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для эффСктивной Ρ€Π°Π±ΠΎΡ‚Ρ‹ с исходным ΠΊΠΎΠ΄ΠΎΠΌ Scheme. Он разрабатывался для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Gauche Scheme , Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π΄ΠΈΠ°Π»Π΅ΠΊΡ‚Π°ΠΌΠΈ. Как ΠΈ quack , ΠΎΠ½ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π° cmuscheme .

Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ возмоТности:

  • вставку кусков ΠΊΠΎΠ΄Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ шаблонов
  • ΠΏΠΎΠΊΠ°Π· описаний для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
  • Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½

Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Π΅ отличия ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² β€” вмСсто взаимодСйствия с ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ стандартный Π²Π²ΠΎΠ΄ ΠΈ Π²Ρ‹Π²ΠΎΠ΄, Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ простой сСтСвой ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ большСС количСство Π·Π°Π΄Π°Ρ‡, Π½ΠΎ сильно зависит ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ процСсса Scheme (сСрвСра gds ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ взаимодСйствия с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ процСссами.

Установка ΠΈ настройка

ΠŸΠ°ΠΊΠ΅Ρ‚ gds поставляСтся вмСстС с послСдними вСрсиями Guile, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ лишь Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ с исходными тСкстами Emacs Lisp Π² ΠΏΡƒΡ‚ΠΈ поиска Emacs, ΠΈ Π²ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Ρ„Π°ΠΉΠ» ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строчку:

(require "gds )

Данная ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈ запуска ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ процСсса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π·Π° взаимодСйствиС с ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ Scheme. Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π½Π° Scheme Π² путях поиска Guile. Если ΠΏΠ°ΠΊΠ΅Ρ‚ находится Π² нСстандартном мСстС, Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΅Π³ΠΎ располоТСниС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ gds-scheme-directory , ΠΈΠ½Π°Ρ‡Π΅, ΠΏΡ€ΠΈ отсутствии этого ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ.

ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ настройки ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π³Ρ€ΡƒΠΏΠΏΡƒ настройки gds .

Π Π°Π±ΠΎΡ‚Π° с исходным ΠΊΠΎΠ΄ΠΎΠΌ

ΠŸΠ°ΠΊΠ΅Ρ‚ gds для вычислСния ΠΊΠΎΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚Π΅ ΠΆΠ΅ сочСтания клавиш, Ρ‡Ρ‚ΠΎ ΠΈ cmuscheme . Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ являСтся функция gds-eval-expression (C-c C-e), которая вычисляСт Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π² ΠΌΠΈΠ½ΠΈ-Π±ΡƒΡ„Π΅Ρ€Π΅.

Одним ΠΈΠ· приятных Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΉ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… gds являСтся Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ справки ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… символах ΠΈ/ΠΈΠ»ΠΈ поиск символа ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ.

Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ производится Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ gds-complete-symbol (сочСтаниС клавиш M-TAB), которая стараСтся Π½Π°ΠΉΡ‚ΠΈ всС извСстныС символы, Ρ‡ΡŒΠΈ ΠΈΠΌΠ΅Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Π΅ΠΌ Π±ΡƒΠΊΠ²Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ находятся ΠΏΠ΅Ρ€Π΅Π΄ курсором. Если Π½Π°ΠΉΠ΄Π΅Π½ΠΎ ΠΎΠ΄Π½ΠΎ имя, Ρ‚ΠΎ ΠΎΠ½ΠΎ вставляСтся сразу, Π½ΠΎ Ссли Π΅ΡΡ‚ΡŒ нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ², Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎΠ΅ имя.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ справки Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ символ производится с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gds-help-symbol (C-h g), которая Π²Ρ‹Π΄Π°Π΅Ρ‚ Ρ‚Π΅ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, Ρ‡Ρ‚ΠΎ ΠΈ запуск ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ (help SYMBOL) Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ срСдС Guile. Имя символа Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠΈΠ½ΠΈ-Π±ΡƒΡ„Π΅Ρ€, Π½ΠΎ Π² качСствС значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ имя, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится курсор. Если Π²Ρ‹ Π½Π΅ ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ имя символа, Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ gds-apropos (C-h G), которая Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ (apropos REGEXP) Π² Guile, ΠΈ которая Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ список символов, Ρ‡ΡŒΠΈ ΠΈΠΌΠ΅Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠΌΡƒ рСгулярному Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ.

ΠžΡ‚Π»Π°Π΄ΠΊΠ°

Для использования возмоТностСй gds Π² процСссС ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ всС Ρ€Π°Π²Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с gds . НапримСр, использованиС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ:

(use-modules (ice-9 gds-client debugging traps)) (named-module-use! "(guile-user) "(ice-9 session)) (gds-accept-input #f)

ПослС этого, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с gds . Для установки Ρ‚ΠΎΡ‡ΠΊΠΈ остановки Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ proc_name , ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ, вычисляСмый Π² Π±ΡƒΡ„Π΅Ρ€Π΅ с исходным ΠΊΠΎΠ΄ΠΎΠΌ:

(install-trap (make #:behaviour gds-debug-trap #:procedure proc_name))

ΠΈ послС Π²Ρ‹Π·ΠΎΠ²Π° ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π² ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π² Π±ΡƒΡ„Π΅Ρ€Π΅ gds ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

Calling procedure: => s s --:** PID XXXXX (Guile-Debug)--All--------

Π² этом Π±ΡƒΡ„Π΅Ρ€Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ ΠΏΠΎ стСку, ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ состояниС, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈ/ΠΈΠ»ΠΈ пошаговоС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. Π Π°Π±ΠΎΡ‚Π° Π² Π±ΡƒΡ„Π΅Ρ€Π΅ стСка обСспСчиваСтся Π·Π° счСт использования Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ количСства ΠΊΠΎΠΌΠ°Π½Π΄, привязанных ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ клавишам.

Для пСрСмСщСния ΠΏΠΎ стСку Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ клавиши: u , C-p ΠΈ стрСлка Π²Π²Π΅Ρ€Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для пСрСмСщСния Π²Π²Π΅Ρ€Ρ… ΠΏΠΎ стСку Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈ Π²Ρ‹Π±ΠΎΡ€Π° этого Ρ„Ρ€Π΅ΠΉΠΌΠ° (функция gds-up), d , C-n ΠΈ стрСлка Π²Π½ΠΈΠ· β€” для пСрСмСщСния Π²Π½ΠΈΠ· (gds-down), Π° клавиша RET ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ‹Π±ΠΎΡ€Π° Ρ„Ρ€Π΅ΠΉΠΌΠ° Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится курсор.

Π’Ρ‹Π±ΠΎΡ€ Ρ„Ρ€Π΅ΠΉΠΌΠ° стСка ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΠΎΠΊΠ°Π·Ρƒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ части исходного ΠΊΠΎΠ΄Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, относящиСся ΠΊ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌΡƒ Ρ„Ρ€Π΅ΠΉΠΌΡƒ, ΠΏΡ€ΠΈ своСм Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ.

К Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ функциям, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΌ Π² Π±ΡƒΡ„Π΅Ρ€Π΅ стСка относятся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

gds-evaluate (клавиша e) позволяСт Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌΡƒ Ρ„Ρ€Π΅ΠΉΠΌΡƒ, ΠΏΡ€ΠΈ этом Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ отобраТаСтся Π² эхо-области; gds-frame-info (i) ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌ Ρ„Ρ€Π΅ΠΉΠΌΠ΅ β€” строку Π² исходном Ρ„Π°ΠΉΠ»Π΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Ρ‚ΠΈΠΏ Ρ„Ρ€Π΅ΠΉΠΌΠ° ΠΈ Ρ‚.ΠΏ.; gds-frame-args (A) ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„Ρ€Π΅ΠΉΠΌΠ° прилоТСния; gds-proc-source (S) ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ исходный ΠΊΠΎΠ΄ Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. Π­Ρ‚Π° функция ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Π° Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° создана Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΌ лямбда-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² стСкС Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² Π²ΠΈΠ΄Π΅ Π§Ρ‚ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ понятным, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ дальшС.

Для продолТСния выполнСния ΠΏΡ€Π΅Ρ€Π²Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, gds Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

gds-go (g , c ΠΈΠ»ΠΈ q) ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹; gds-step-file (SPC) выполняСт ΠΎΠ΄ΠΈΠ½ шаг Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, относящихся ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ исходному Ρ„Π°ΠΉΠ»Ρƒ, Ρ‡Ρ‚ΠΎ ΠΈ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π΅ΠΉΠΌ стСка. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, Π½ΠΎ Π±Π΅Π· Π²Ρ…ΠΎΠ΄Π° Π² Π½ΠΈΡ…; gds-step-into (i) выполняСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг. Π­Ρ‚ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹; gds-step-over (o) выполняСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ° стСка.

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

Scheme48

scheme48 β€” Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°ΠΊΠ΅Ρ‚ основанный Π½Π° cmuscheme , Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Scheme48. Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ добавляСт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ font-lock для ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², спСцифичСских для Scheme48, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ привязки клавиш для ΠΊΠΎΠΌΠ°Π½Π΄ вычислСния Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° установки этого ΠΏΠ°ΠΊΠ΅Ρ‚Π° стандартна β€” помСститС gambit.el Π² мСсто, Π³Π΄Π΅ Π΅Π³ΠΎ Π½Π°ΠΉΠ΄Π΅Ρ‚ Emacs, ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строки Π² Ρ„Π°ΠΉΠ» ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

(autoload "gambit-inferior-mode "gambit" "Hook Gambit mode into cmuscheme." ) (autoload "gambit-mode "gambit" "Hook Gambit mode into scheme." ) (add-hook "inferior-scheme-mode-hook (function gambit-inferior-mode)) (add-hook "scheme-mode-hook (function gambit-mode)) (setq scheme-program-name "gsi -:d-" )

Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Gambit запускаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ run-scheme , Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π² cmuscheme , Π½ΠΎ gambit добавляСт ΠΊ Π½Π΅ΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹Π²ΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎ позволяСт ΠΏΠ°ΠΊΠ΅Ρ‚Ρƒ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ мСстополоТСнии Π² исходном Ρ„Π°ΠΉΠ»Π΅. ПослС запуска ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стандартныС сочСтания клавиш для выполнСния ΠΈ компиляции ΠΊΠΎΠ΄Π° β€” C-x C-e , C-c C-l , C-c C-k ΠΈ Ρ‚.Π΄.

Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ функциям cmuscheme , ΠΏΠ°ΠΊΠ΅Ρ‚ gambit ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ исходного ΠΊΠΎΠ΄Π°:

gambit-continue (F8 ΠΈΠ»ΠΈ C-c c) ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°. Аналогично ΠΊΠΎΠΌΠ°Π½Π΄Π΅,c ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°; gambit-crawl-backtrace-newer (F9 ΠΈΠ»ΠΈ C-c ]) ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡƒ Ρ„Ρ€Π΅ΠΉΠΌΡƒ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅. Аналогично ΠΊΠΎΠΌΠ°Π½Π΄Π΅,- ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°; gambit-crawl-backtrace-older (F10 ΠΈΠ»ΠΈ C-c [) ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Ρ„Ρ€Π΅ΠΉΠΌΡƒ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅. Аналогично ΠΊΠΎΠΌΠ°Π½Π΄Π΅,+ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°; gambit-step-continuation (F11 ΠΈΠ»ΠΈ C-c s) Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ шаг вычислСния Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Аналогично ΠΊΠΎΠΌΠ°Π½Π΄Π΅,s ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°; gambit-leap-continuation (F12 ΠΈΠ»ΠΈ C-c l) Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ шаг вычислСния, Π½Π΅ заходя Π² Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Аналогично ΠΊΠΎΠΌΠ°Π½Π΄Π΅,l ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°; gambit-kill-last-popup (C-c _) ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΎΠΊΠ½ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ создано для ΠΏΠΎΠΊΠ°Π·Π° выраТСния.

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ сочСтания клавиш для этих ΠΊΠΎΠΌΠ°Π½Π΄: M-c , M-[ , M-] , M-s , M-l ΠΈ M-_ , Π½ΠΎ ΠΎΠ½ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Π½Π΅ совсСм ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ соглашСниям, принятым для сочСтаний клавиш Π² Emacs. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΈΡ… использованиС, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ (ΠΈΠ»ΠΈ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π΅ Π² Ρ„Π°ΠΉΠ» ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ):

(setq gambit-repl-command-prefix "\e" )

Bee-mode (bmacs)

bmacs β€” это рСализация ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ срСды для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Bigloo Scheme . Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ возмоТности:

  • ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΊΠΎΠ΄Π°;
  • ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅;
  • автоматичСскоС созданиС ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² Makefile;
  • навигация ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ;
  • интСграция с систСмами контроля вСрсий;
  • просмотр Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ;
  • ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°;
  • раскрытиС макросов;
  • нСкоторая ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π³Ρ€Π°ΠΌΠΎΡ‚Π½ΠΎΠ³ΠΎ стиля программирования (literate programming).

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ этого ΠΏΠ°ΠΊΠ΅Ρ‚Π° трСбуСтся Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ количСства Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… поставляСтся вмСстС с Bigloo. Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° сайтС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° , Π»ΠΈΠ±ΠΎ Π² составС дистрибутива.

Установка ΠΈ настройка

Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ поставляСтся Π² составС Bigloo Scheme ΠΈ находится Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ bmacs дистрибутива. Для установки ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π½Π°Π΄ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΈ Ρ‚Π°ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

Make make install EMACSDIR =

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

(autoload "bdb "bdb" "bdb mode" t) (autoload "bee-mode "bee-mode" "bee mode" t) (setq auto-mode-alist (append "(("\\.scm$" . bee-mode) ("\\.sch$" . bee-mode) ("\\.scme$" . bee-mode) ("\\.bgl$" . bee-mode) ("\\.bee$" . bee-mode)) auto-mode-alist))

Настройки ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ установлСны ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π³Ρ€ΡƒΠΏΠΏΡƒ настройки bee , которая обСспСчиваСт Π·Π°Π΄Π°Π½ΠΈΠ΅ настроСк для bee-mode , ΠΈ Π³Ρ€ΡƒΠΏΠΏ dbg & bug , ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для задания настроСк ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°.

Π Π°Π±ΠΎΡ‚Π° с исходным ΠΊΠΎΠ΄ΠΎΠΌ

ПослС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ bee-mode ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ основныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠΊΠΎΠ½ΠΊΠΈ Ρ‚ΡƒΠ»Π±Π°Ρ€Π°, ΠΈΠ»ΠΈ выбирая Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΏΡƒΠ½ΠΊΡ‚Ρ‹ ΠΈΠ· мСню Bee , ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ появляСтся ΠΏΡ€ΠΈ запускС Ρ€Π΅ΠΆΠΈΠΌΠ°.

Для расстановки отступов Π² соотвСтствии с принятыми для Bigloo соглашСниями, ΠΏΠ°ΠΊΠ΅Ρ‚ bee-mode опрСдСляСт нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ: bee-indent-sexp (C-M-q) расставляСт отступы для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ выраТСния, bee-indent-define (C-c TAB C-d) Π΄Π΅Π»Π°Π΅Ρ‚ это для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, bee-indent-last-sexp (C-c TAB C-l) расставляСт отступы для выраТСния ΠΏΠ΅Ρ€Π΅Π΄ курсором ΠΈ Ρ‚.Π΄.

ΠžΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с исходным ΠΊΠΎΠ΄ΠΎΠΌ, это Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ поиска ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ bee-tags-find (C-x 5 .) ΠΈΠ»ΠΈ bee-tags-find-variable (C-c C-d f). А для поиска опрСдСлСния модуля сущСствуСт функция bee-find-module (C-c C-d m). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, bee-mode пСрСопрСдСляСт Π΄Π²Π° сочСтания клавиш β€” M-. & M-, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΊ функциям bee-tag-find ΠΈ bee-tags-find-next , Ρ‡Ρ‚ΠΎ позволяСт Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ опрСдСлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ классов.

Для упрощСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ с модулями, bee-mode опрСдСляСт Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ списком ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ β€” функция bee-import-binding (C-c RET i), Π° Ρ‚Π°ΠΊΠΆΠ΅ списком Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, экспортируСмых ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ модуля β€” bee-export-function (C-c RET f) ΠΈ bee-export-variable (C-c RET v). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, сущСствуСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ функция, которая позволяСт ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ символы ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ² Π½Π° языкС C β€” bee-import-c-file (C-c RET c), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ½Π° обновляСт Makefile , добавляя Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ для компиляции ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°.

ΠŸΠ°ΠΊΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ обСспСчиваСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Π³Ρ€Π°ΠΌΠΎΡ‚Π½ΠΎΠ³ΠΎ программирования (literate programming). РСализуСмая ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½Π΅ являСтся ΠΏΠΎΠ»Π½ΠΎΠΉ, Π½ΠΎ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ позволяСт Π²ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π² ΠΊΠΎΠ΄ ссылки Π½Π° описания ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π­Ρ‚ΠΎ достигаСтся Π·Π° счСт использования ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов @path , @node & @deffn Π² коммСнтариях для модуля ΠΈ описаний Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова @path & @node ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Ρ„Π°ΠΉΠ» ΠΈ Ρ€Π°Π·Π΄Π΅Π» Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΡ… Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ для объявлСния модуля. А ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово @deffn указываСтся Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ эти ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ быстрого ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΊ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ Ρ€Π°Π·Π΄Π΅Π»Π°ΠΌ ΠΈ описаниям Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‡Ρ‚ΠΎ позволяСт ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈ компиляция ΠΊΠΎΠ΄Π°

Π’Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, bee-mode позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠ΄ Scheme нСпосрСдствСнно ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π° Emacs. Для запуска ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ude-repl-other-frame (C-c C-r C-r), Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΈΠΊΠΎΠ½ΠΊΡƒ Ρ‚ΡƒΠ»Π±Π°Ρ€Π° (Repl ), ΠΈΠ»ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡƒΠ½ΠΊΡ‚ мСню.

И послС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

  • ude-repl-send-buffer (C-c C-r b) ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ для вычислСния вСсь Π±ΡƒΡ„Π΅Ρ€;
  • ude-repl-send-region (C-c C-r r), ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°;
  • bee-repl-send-define (C-c C-r d) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для выполнСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ опрСдСлСния (define);
  • bee-repl-send-last-sexp (C-c C-r l) вычисляСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выраТСния ΠΏΠ΅Ρ€Π΅Π΄ курсором;
  • bee-repl-send-toplevel-sexp (C-c C-r t) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для вычислСния всСго Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ выраТСния.

ΠžΡ‡Π΅Π½ΡŒ часто ΠΏΡ€ΠΈ использовании макросов Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡ… раскрытия. Π’Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ, bee-mode Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для раскрытия макросов Π² вашСм ΠΊΠΎΠ΄Π΅ (ΠΏΡ€ΠΈ этом, вСсь Π±ΡƒΡ„Π΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ просканирован Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ наличия ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ макросов):

  • bee-expand-buffer (C-c C-e C-e) ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ΠΈΡŽ макросов Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Π±ΡƒΡ„Π΅Ρ€Π΅;
  • bee-expand-region (C-c C-e C-r) раскрываСт макросы Π² Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅;
  • bee-expand-define (C-c C-e C-d) раскрываСт макросы Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ (define)
  • bee-expand-last-sexp (C-c C-e C-l) ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ раскрытиС макросов Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄ курсором;
  • bee-expand-toplevel-sexp (C-c C-e C-t) раскрываСт макросы Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ.

Для компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Makefile , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описываСт зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ модулями ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π»Π°Π³ΠΈ компиляции. Для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° β€” bee-mode пытаСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΏΡƒΡ‚Π΅ΠΌ поиска ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ² Makefile , .afile ΠΈΠ»ΠΈ.etags , ΠΈΠ»ΠΈ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ установлСн с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ude-user-set-root-directory (C-c C-p C-r) ΠΈΠ»ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ Ρ‚ΡƒΠ»Π±Π°Ρ€Π°.

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π·Π°Π΄Π°Π½, Makefile ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сгСнСрирован с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ude-generate-makefile (C-c C-c a ΠΈΠ»ΠΈ C-c C-c C-l), которая запросит Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ имя исполняСмого модуля, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ скомпилирован Π΄Π°Π½Π½Ρ‹ΠΉ исходный ΠΊΠΎΠ΄. Π’ Ρ‚ΠΎΠΌ случаС, Ссли Makefile ΡƒΠΆΠ΅ сущСствуСт, Ρ‚ΠΎ эти ΠΆΠ΅ сочСтания клавиш ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ Π΅Π³ΠΎ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ΅Ρ€Π΅ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ Ρ„Π°ΠΉΠ»Ρ‹.afile ΠΈ.etags . ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, имССтся Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для рСдактирования Makefile β€” ude-edit-makefile (C-c C-c e), обновлСния Makefile β€” ude-update-makefile (C-c C-c u), ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ вСрсиями ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ β€” ude-makefile-debug-mode (C-c C-c C-d) & ude-makefile-final-mode (C-c C-c C-f) ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅.

Когда Makefile сущСствуСт, Ρ‚ΠΎ появляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ компиляции ΠΊΠΎΠ΄Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ude-mode-compile-from-menu (C-c C-c C-c) . ΠŸΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ kill-compilation (C-c C-c k).

И послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ компиляция закончится, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ исполняСмый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ude-execute (C-c C-c C-r).

ΠžΡ‚Π»Π°Π΄ΠΊΠ° ΠΈ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

ВмСстС с ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ Bigloo поставляСтся ΠΈ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ исходного ΠΊΠΎΠ΄Π°. bee-mode ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ взаимодСйствиС с этим ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ Π² Emacs. Для запуска ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° Π½Π°Π΄ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ bee-debug (C-c C-b C-b) ΠΈΠ»ΠΈ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΈΠΊΠΎΠ½ΠΊΡƒ Ρ‚ΡƒΠ»Π±Π°Ρ€Π°, ΠΈΠ»ΠΈ ΠΏΡƒΠ½ΠΊΡ‚ мСню. Но запуск ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ автоматичСскому ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ ΠΊ Π½Π΅ΠΌΡƒ, поэтому Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ явно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ bee-toggle-connect-buffer (C-c C-b c) Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π±ΡƒΡ„Π΅Ρ€ с ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΠΈ останова ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π°Ρ…ΠΎΠ΄ΡΡΡŒ Π² Π±ΡƒΡ„Π΅Ρ€Π΅ с исходным тСкстом.

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ поддСрТиваСтся автоматичСски, Ссли Π²Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ Makefile . Π§Ρ‚ΠΎΠ±Ρ‹ провСсти ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΅Π³ΠΎ сначала ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ профилирования, Ρ‡Ρ‚ΠΎ выполняСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ bee-profiler-start (C-c C-p c). А послС компиляции, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ bee-profiler-inspect (C-c C-p i), Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ запуску ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΊ запуску ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ bglprof , которая собСрСт Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ, ΠΈ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΈΡ… Π² ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΌ для Π°Π½Π°Π»ΠΈΠ·Π° Π²ΠΈΠ΄Π΅.

ΠŸΡ€ΠΎΡ‡ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

ΠŸΠ°ΠΊΠ΅Ρ‚ прСдоставляСт возмоТности ΠΏΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡŽ справочной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сдСлано ΠΏΡƒΡ‚Π΅ΠΌ запуска Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bee-doc-visit (C-c C-d i) ΠΈΠ»ΠΈ наТатия Π½Π° ΠΈΠΊΠΎΠ½ΠΊΡƒ Info Π² Ρ‚ΡƒΠ»Π±Π°Ρ€Π΅. Π­Ρ‚Π° функция Π²Π΅Π΄Π΅Ρ‚ сСбя ΠΏΠΎ Ρ€Π°Π·Π½ΠΎΠΌΡƒ Π² зависимости ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ полоТСния курсора β€” Ссли курсор находится Π½Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π΅, Ρ‚ΠΎ выдаСтся докумСнтация для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°, Ссли Π²Ρ‹Π΄Π΅Π»Π΅Π½ Ρ€Π΅Π³ΠΈΠΎΠ½ ΠΊΠΎΠ΄Π°, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π°Π½Π° докумСнтация для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅Π³ΠΈΠΎΠ½Π°. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½ΠΎ имя ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π».

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ, показываСмая ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ бСрСтся ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Info, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ вмСстС с Bigloo. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, докумСнтация ищСтся Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ… Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΈ ΠΎΠ½ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ автоматичСски. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ поиск.

ΠŸΠ°ΠΊΠ΅Ρ‚ bmacs Ρ‚Π°ΠΊΠΆΠ΅ прСдставляСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ количСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с систСмами контроля вСрсий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². Но Π² связи с появлСниСм Π½ΠΎΠ²Ρ‹Ρ… систСм контроля вСрсий, ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… интСрфСйсов для Π½ΠΈΡ…, эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ становятся Π½Π΅ особо вострСбованными.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, сущСствуСт мноТСство Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠ΄ΠΎΠΌ, написанным Π½Π° языкС C, ΠΈ Ρ‚.ΠΏ., Π½ΠΎ описаниС этих возмоТностСй Π»Π΅ΠΆΠΈΡ‚ Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Π°ΠΌΠΈ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Scheme Π² SLIME

Для использования SLIME со Scheme, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π±Π°Π·ΠΎΠ²ΡƒΡŽ настройку ΠΏΠ°ΠΊΠ΅Ρ‚Π°, ΠΊΠ°ΠΊ это описано Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ посвящСнном этому ΠΏΠ°ΠΊΠ΅Ρ‚Ρƒ, Π° Π·Π°Ρ‚Π΅ΠΌ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ . Π’ ΠΎΠ±Ρ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅ это дСлаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

(add-hook "slime-load-hook (lambda () (require "slime-scheme )))

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° установит Ρ…ΡƒΠΊΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со SLIME , Π½ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΠΌΡ‹Ρ… Π΄ΠΈΠ°Π»Π΅ΠΊΡ‚ΠΎΠ² Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ настройку Π² соотвСтствии с инструкциями, ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ Ρ„Π°ΠΉΠ»Π΅ β€” swank-kawa.scm ΠΈΠ»ΠΈ swank-mit-scheme.scm .

А всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅, ΠΊΠ°ΡΠ°ΡŽΡ‰Π΅Π΅ΡΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со SLIME , описано Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ .

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΉ процСсс Scheme. Но Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ , Ссли Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… процСссов ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² поставкС bmacs Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ cee , ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для рСдактирования ΠΊΠΎΠ΄Π° Π½Π° языкС C, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ для написания Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Bigloo, bug-mode, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° Bigloo, ΠΈ ude (Unix Development Environment), Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ компиляции, ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² Ρ€Π°Π±ΠΎΡ‚Π΅ с Bigloo.

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ссли Makefile Π½Π΅ сущСствуСт, Ρ‚ΠΎ эта функция ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ запуску компиляции исполняСмого модуля ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°.

Π’Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ swank -ΠΌΠΎΠ΄ΡƒΠ»ΡŒ.

ВсС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, относящиСся ΠΊ Scheme, находятся Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ contrib дистрибутива SLIME, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² ΠΏΡƒΡ‚ΠΈ поиска.

КСн Π”ΠΈΠΊΠΈ (ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ АлСксСя ДСсятника)

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ взгляд Π½Π° ΠΌΠΈΡ€

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ язык программирования прСдставляСт собой ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΌΠΈΡ€ΠΎΠ²ΠΎΠ·Π·Ρ€Π΅Π½ΠΈΠ΅ Π² понятиях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ позволяСт (ΠΈΠ»ΠΈ Π½Π΅ позволяСт) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π­Ρ‚Π° сСрия статСй описываСт взгляд Π½Π° ΠΌΠΈΡ€ языка программирования Π‘Ρ…Π΅ΠΌΠ° (Β«Π‘Ρ…Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎΠ΅ ΠΌΠΈΡ€ΠΎΠ²ΠΎΠ·Π·Ρ€Π΅Π½ΠΈΠ΅Β»). Π”Π°Π½Π½ΠΎΠ΅ ΠΌΠΈΡ€ΠΎΠ²ΠΎΠ·Π·Ρ€Π΅Π½ΠΈΠ΅ содСрТит мноТСство соврСмСнных элСмСнтов программирования: ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌ программирования, Π»Π΅Π³ΠΊΠΎ сочСтаСмыС, ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ абстракции, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ создания языка, Β«Π·Π°Ρ‚ΠΎΡ‡Π΅Π½Π½ΠΎΠ³ΠΎΒ» ΠΏΠΎΠ΄ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, Ρ‡Π΅Ρ‚ΠΊΠΎΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ пСрСносимыми ΠΈ нСпСрСносимыми частями ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ, начиная ΠΎΡ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ ΠΈ заканчивая ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Π΅ΠΉΡˆΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌΠΈ систСмами.

Π‘Ρ…Π΅ΠΌΠ° Π½Π°Ρ‡ΠΈΠ½Π°Π»Π°ΡΡŒ ΠΊΠ°ΠΊ экспСримСнт Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ языка программирования для тСстирования Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² Ρ‚Π΅ΠΎΡ€ΠΈΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. БСйчас ΠΆΠ΅ ΠΎΠ½Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ располоТСниС со стороны ΠΌΠ½ΠΎΠ³ΠΈΡ… извСстных унивСрситСтов (Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ МВИ – ΠœΠ°ΡΡΠ°Ρ‡ΡƒΡΠ΅Ρ‚ΡΠΊΠΈΠΉ ВСхничСский Π˜Π½ΡΡ‚ΠΈΡ‚ΡƒΡ‚) Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΈΠ·ΡƒΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ языка программирования. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π‘Ρ…Π΅ΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎΡΡ‚ΠΈ Ρ‚Π°ΠΊΠΈΠΌΠΈ компаниями, ΠΊΠ°ΠΊ DEC , Texas Instruments , Tektronix , Hewlett Packard ΠΈ Sun .

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π‘Ρ…Π΅ΠΌΠ°?

Π‘Ρ…Π΅ΠΌΠ° – это малСнький, ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ «чистый» язык, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ (Ρ‡Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ!) приятно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π‘Ρ…Π΅ΠΌΠ° Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π»Π°ΡΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠ°Π»ΠΎΠ΅ число ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Ρ… конструкций ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ€Π°Π·Π½Ρ‹Ρ… стилях программирования: Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΈ ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ языка Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ всСго ΠΎΠΊΠΎΠ»ΠΎ 50 (!) страниц, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ сСмантики. Π‘Ρ…Π΅ΠΌΠ° основываСтся Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ лямбда-вычислСний, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ здСсь ΠΏΠΎΠ»Π½ΠΎ особСнностСй, ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… для Ρ‚Π΅ΠΎΡ€Π΅Ρ‚ΠΈΠΊΠΎΠ²; это позволяСт достаточно Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΡƒΠΌΠ½Ρ‹Π΅ срСдства Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

Π‘Ρ…Π΅ΠΌΠ° ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ лСксичСских областСй видимости, ΠΎΠ΄Π½ΠΎΡ€ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° вычислСний, ΠΈ ΠΎΠ΄Π½ΠΎΡ€ΠΎΠ΄Π½ΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…. Π‘Ρ…Π΅ΠΌΠ° Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ понятий указатСля, Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… цикличСских конструкций ΠΈΠ»ΠΈ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ управлСния Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹Ρ….

На Ρ‡Ρ‚ΠΎ ΠΆΠ΅ ΠΏΠΎΡ…ΠΎΠΆΠ° Π‘Ρ…Π΅ΠΌΠ°? Ну, ΠΎΠ½Π° сильно смахиваСт Π½Π° Лисп. ΠŸΡƒΡΡ‚ΡŒ это вас Π½Π΅ ΠΏΡƒΠ³Π°Π΅Ρ‚: внСшний Π²ΠΈΠ΄ Π‘Ρ…Π΅ΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ (ΠΈ этим ΠΌΡ‹ займСмся Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ). Π§Ρ‚ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Π°ΠΆΠ½ΠΎ, Ρ‚Π°ΠΊ это Ρ‚Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Ρ‹ Π² основу Π‘Ρ…Π΅ΠΌΡ‹, ΠΈ возмоТности ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π˜Ρ‚Π°ΠΊ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ сравним Π‘Ρ…Π΅ΠΌΡƒ ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ «классичСский» язык программирования – скаТСм, Π‘ΠΈ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π‘Ρ…Π΅ΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€Π΅Ρ„ΠΈΠΊΡΠ½ΡƒΡŽ запись, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ инфиксной записи Π‘ΠΈ:

Π‘Ρ…Π΅ΠΌΠ°

Π‘ΠΈ

(+ 2 3 4)

(2 + 3 + 4)

(< low x high)

((low < x) && (x < high))

(+ (* 2 3) (* 4 5))

((2 * 3) + (4 * 5))

(f x y)

f(x, y)

(define (square x) (* x x))

int square(int x)

return (x * x)

Π’ Π‘Ρ…Π΅ΠΌΠ΅ всС Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… эквивалСнтны. ВсС, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с ΠΎΠ΄Π½ΠΈΠΌ Ρ‚ΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ со всСми ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ. Π­Ρ‚ΠΎ Ρ€Π΅Π·ΠΊΠΎ отличаСтся ΠΎΡ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° языков программирования, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ языков, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, числа ΠΈΠΌΠ΅ΡŽΡ‚ особыС ΠΏΡ€Π°Π²Π°: ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π±Π΅Π· присваивания ΠΈΠΌ ΠΈΠΌΠ΅Π½ (Π²ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ Π² БСйсикС ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ число Π½Π°Π΄ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π°Π·Π½Π°Ρ‡Π°Ρ‚ΡŒ имя ΠΏΠ΅Ρ€Π΅Π΄ Π΅Π³ΠΎ использованиСм!). Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹: ΠΎΠ½ΠΈ обязаны ΠΈΠΌΠ΅Ρ‚ΡŒ имя.

Π’ Π‘Ρ…Π΅ΠΌΠ΅, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π΅Π· ΠΈΠΌΠ΅Π½ΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова lambda :

(lambd a (x) (* x x)); Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ – функция!

(define sq (lambda (x) (* x x))

(sq 9) ; 27

((lambda (x) (* x x)) 9) ; 27

((if (foo? x) * +) 2 3 4) ; Ссли (foo? x) истинно ,

; Ρ‚ΠΎ (* 2 3 4) ,

; ΠΈΠ½Π°Ρ‡Π΅ (+ 2 3 4)

(define (curried-add x) (lambda (y) (+ x y))

(define add3 (curried-add 3)) ; add3 - функция

(add3 7) ; 10

((curried-add 3) 7) ; 10

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹:

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ любого Ρ‚ΠΈΠΏΠ°;

ИмСна ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ значСния; ΠΈΠΌΠ΅Π½Π° Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹;

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ – ΠΎΠ΄Π½Π° ΠΈΠ»ΠΈ нСсколько Ρ„ΠΎΡ€ΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ скобками;

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π½Π°Π΄ΠΎ сначала Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ значСния всСх Ρ„ΠΎΡ€ΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ скобками, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΊΠΎ всСм ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ; Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ выраТСния Ρ‚Π°ΠΊΠΆΠ΅ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ;

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ начинаСтся символом Β«Ρ‚ΠΎΡ‡ΠΊΠ° с запятой» (;) ΠΈ продолТаСтся Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° строки;

Когда функция вычисляСтся, ΠΎΠ½Π° «вспоминаСт» состояниС Β«ΠΎΠΊΡ€ΡƒΠΆΠ°ΡŽΡ‰Π΅ΠΉ срСды», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½Π° создавалась (Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ add 3 вспоминаСт, Ρ‡Ρ‚ΠΎ X Π±Ρ‹Π»ΠΎ Ρ€Π°Π²Π½ΠΎ Ρ‚Ρ€Π΅ΠΌ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅Π΅ создания, Ρ‚.Π΅. Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ вычислСния выраТСния ( lambda ( y ) (+ x y )) 7) ).

( define ( sq x ) (* x x )) – это всСго лишь другая Ρ„ΠΎΡ€ΠΌΠ° записи выраТСния

(define sq (lambda (x) (* x x))

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ сСмь Π²ΠΈΠ΄ΠΎΠ² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ:

ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹: "foo#\Z3”строка”

Бсылки Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅: foo joe a - long - name @#$!+-*/%<>

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: ( lambda ( z ) (* z z z ))

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹: ( cube 37)

УсловиС: (if (< x 3) sqrt modulo)

ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ значСния: ( set ! x 5)

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ: ( begin ( write x ) ( write y ) ( newline ))

(разумССтся, Π² этом спискС пСрСчислСны Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ всС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ)

Π‘Ρ…Π΅ΠΌΠ° ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…:

Π›ΠΈΡ‚Π΅Ρ€Ρ‹ (character): #\a #\A \#space #\newline

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ (string ): ”строка тСкста”

ΠœΠ°ΡΡΠΈΠ²Ρ‹ (Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ – vector ): #(1 2 ”строка” #\ x 5)

Бписки (list): (a little (list of) (lists))

Числа (numbers): 47 1/3 2.3 4.3e14 1+3i

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ (function )

ЛогичСскиС значСния (boolean , соотв. истина ΠΈ лоТь): # t # f

ΠŸΠΎΡ€Ρ‚Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ»ΠΈ сСтСвыС соСдинСния)

Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ (symbol , ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для обозначСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…): this - is - a - symbol foo a 32 > adfasf 23@#$%!<

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹:

Π’Π΅ΠΊΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· Π»ΡŽΠ±Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…;

Π‘ΠΈΠΌΠ²ΠΎΠ» ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π±ΡƒΠΊΠ²Ρ‹ английского Π°Π»Ρ„Π°Π²ΠΈΡ‚Π°, Ρ†ΠΈΡ„Ρ€Ρ‹ ΠΈ Π»ΠΈΡ‚Π΅Ρ€Ρ‹ + - . * / < = > ! ? : $ % _& ~ ^

Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ Π½Π΅ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ ΠΊ рСгистру Π±ΡƒΠΊΠ² (Ρ‚.Π΅. символы SYMBOL ΠΈ SyMboL ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹)

Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для обозначСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (Π½ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для этого!)

По соглашСнию (просто для удобства) ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹ (выраТСния ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ) Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° Π²ΠΎΠΏΡ€ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π·Π½Π°ΠΊ, Π° «опасныС» (ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° Π²ΠΎΡΠΊΠ»ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π·Π½Π°ΠΊ

Числа особСнно интСрСсны Π² Π‘Ρ…Π΅ΠΌΠ΅: ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ (integer ) являСтся Π΄Ρ€ΠΎΠ±ΡŒΡŽ (rational ), Π΄Ρ€ΠΎΠ±ΡŒ – Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ числом (real ), Π° Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число – комплСксным (complex ). Числа ΠΊΠ»Π°ΡΡΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠΎ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΡƒ точности (Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ – exact /inexact ):

(exact? 3); #t

(exact? 1/3); #t

(exact? 2.3##); #f

(+ 2/3 1/2 5/6); 2

(integer? 2); #t

(integer? 3/7); #f

(real? 2); #t

Ѐилософия Π‘Ρ…Π΅ΠΌΡ‹

Одна ΠΈΠ· приятных особСнностСй Π‘Ρ…Π΅ΠΌΡ‹, которая ΠΏΠΎΠ½Π°Ρ‡Π°Π»Ρƒ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π² Π·Π°ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ – отсутствиС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ. Π‘Ρ…Π΅ΠΌΠ° ΠΎΡ‡Π΅Π½ΡŒ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Π°: программист ΠΌΠΎΠΆΠ΅Ρ‚ Β«ΡΠΊΠ°Π·Π°Ρ‚ΡŒΒ» Π½Π° этом языкС ΠΎΠ΄Π½Ρƒ ΠΌΡ‹ΡΠ»ΡŒ (дСйствиС) ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами. Π’ Π‘Ρ…Π΅ΠΌΠ΅ программист ΠΈΠΌΠ΅Π΅Ρ‚ свободу – ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ – Β«Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒΒ» Π² точности Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ρ…ΠΎΡ‡Π΅Ρ‚. Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΄Ρ€ΡƒΠ³ΠΈΡ… языках программирования ΠΏΠΎΡ€ΠΎΠΉ приходится ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Β«ΠΎΠ±Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈΒ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚ Π½ΠΈΡ… Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅, Π° Π² Π‘Ρ…Π΅ΠΌΠ΅ это просто Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ.

Для Β«Ρ€Π°Π·ΠΎΠ³Ρ€Π΅Π²Π°Β» Π΄Π°Π²Π°ΠΉΡ‚Π΅ построим структуру Π΄Π°Π½Π½Ρ‹Ρ… Β«ΠΏΠ°Ρ€Π°Β» (pair ). ΠŸΠ°Ρ€Π° состоит ΠΈΠ· Π΄Π²ΡƒΡ… элСмСнтов, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ доступа FIRST ΠΈ SECOND (соотвСтствСнно ΠŸΠ•Π Π’Π«Π™ ΠΈ Π’Π’ΠžΠ ΠžΠ™). Ѐункция создания ΠΏΠ°Ρ€Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ PAIR . Π”ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ: ( first ( pair 1 2)) Ρ€Π°Π²Π½ΠΎ 1, ( second ( pair 1 2)) Ρ€Π°Π²Π½ΠΎ 2. Для Π·Π½Π°ΡŽΡ‰ΠΈΡ… Лисп Π² этом Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ. Однако сколькими Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ это Ρ‚Ρ€ΠΈΠΎ: PAIR , FIRST , SECOND ?

; 1. Π’Π΅ΠΊΡ‚ΠΎΡ€

; ΠΌΠΎΠΆΠ½ΠΎ ΠΈ просто (define PAIR vector ) , Π½ΠΎ Ρ‚Π°ΠΊ стилистичСски Π»ΡƒΡ‡ΡˆΠ΅

(define (PAIR a b) (vector a b))

(define (FIRSTaPair) (vector-ref aPair 0))

(define (SECOND aPair) (vector-ref aPair 1))

; 2. Π€ ункция Π²Ρ‹Π±ΠΎΡ€Π°

; НС Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎ Π»Π΅ΠΊΡΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости:

; каТдая функция, создаваСмая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ PAIR, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ

; значСния a ΠΈ b Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ создания

(define (PAIR a b) (lambda (bool) (if bool a b)))

(define (FIRSTaPair) (aPair #t))

(define (SECOND aPair) (aPair #f))

; 3. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° сообщСний

(define (PAIR (a b)

(lambda (msg)

(case msg ; конструкция case для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ значСния msg

; выполняСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ дСйствиС

((first ) a ) ; Ссли сообщСниС – символ first ,

; Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ a

((second) b))))

; апостроф (β€˜) ΠΏΠ΅Ρ€Π΅Π΄ символом Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅

; (Π±Π΅Π· Π½Π΅Π³ΠΎ Π±Ρ‹Π»Π° Π±Ρ‹ ошибка «отсутствуСт пСрСмСнная»)

(define (FIRSTaPair) (aPair β€˜first))

(define (SECOND aPair) (aPair β€˜second))

; 4. ΠŸΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌΡ‹: Π² Π‘Ρ…Π΅ΠΌΠ΅ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… Β«ΠΏΠ°Ρ€Π°Β»!

(define PAIRcons)

(define FIRSTcar)

(define SECOND cdr)

; 5. Лямбда-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π΄Ρ€ΡƒΠ³ΠΈΠΌ

; функциям )

(define (PAIR a b) (lambda (proc) (proc a b)))

(define (FIRSTaPair) (aPair (lambda (x y) x)))

(define (SECOND aPair) (aPair (lambda (x y) y)))

Бмысл всСго Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ: Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠ΅ Π²Π΅Ρ‰ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Ρ€Π°Π·ΠΎΠ³Ρ€Π΅Π»ΠΈΡΡŒ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ взглянСм Π½Π° старый Π΄ΠΎΠ±Ρ€Ρ‹ΠΉ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» (напоминаю: Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» – ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ всСх Ρ†Π΅Π»Ρ‹Ρ… чисСл ΠΎΡ‚ 1 Π΄ΠΎ Π΄Π°Π½Π½ΠΎΠ³ΠΎ числа).

Для Π½Π°Ρ‡Π°Π»Π° – рСкурсивноС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅:

(define (fact n)

(if (< n 2)

(* n (fact (- n 1)))

Когда я (КСн Π”ΠΈΠΊΠΈ) Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΠΈΠ·ΡƒΡ‡Π°Π» рСкурсивныС опрСдСлСния Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ этого, самым слоТным Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ скрытоС состояниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ хранится Π½Π° стСкС. НСбольшоС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π΄Π΅Π»Π°Π΅Ρ‚ стСк Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ.

; функция identity просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ свой Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚

(define (identity value) value)

; сохраним Ρ„ΠΎΡ€ΠΌΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fact

; (Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ½Π° всСго лишь Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ cfact )

(define (fact n) (cfact n identity))

; А функция cfact – вычисляСт Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»

(define (cfact n k)

(if (< n 2)

(k 1)

(cfact (- n 1)

(lambda (result) (k (* n result))))))

Ѐункция cfact – вСрсия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fact , ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ «продолТСния». ВмСсто возвращСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· функция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, Β«ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅Β», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈ вызываСтся с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ вычислСний Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π²Ρ‹Π·ΠΎΠ² ( fact 3) :

(fact 3) становится (cfact 3 identity)

(cfact 3 identity) становится

(cfact 2

(lambda (result)

(identity (* 3 result)))) ; k’

Π­Ρ‚ΠΎ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ прСобразовываСтся Π²

(cfact 1

(lambda (result’) ;; k’’

((lambda (result)

(identity (* 3 result))) ; функция k"

(* 2 result ’)) ; Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ k "

((lambda (result’) ;; k’’

((lambda (result)

(identity (* 3 result)))(* 2 result’))

) 1)

((lambda (result) (identity (* 3 result))) (* 2 1))

(identity (* 3 (* 2 1)))

(* 3 (* 2 1))

-> 6

Π­Ρ‚ΠΎ – Π½Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΠ· простых Π²Π΅Ρ‰Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ уТасно слоТныС. Π—Π°Ρ‡Π΅ΠΌ ΠΆΠ΅ ΠΌΡ‹ Ρ‚Π°ΠΊ сдСлали? Бмысл Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ спрятано Π½Π° стСкС. Π­Ρ‚ΠΎ позволяСт Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ интСрСсныС Π²Π΅Ρ‰ΠΈ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ Β«ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅Β» ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСсто Π½Π΅Π³ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ вычислСния. Если ΠΎΠ½ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Π΅ΠΌ оТидалось, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ нашС ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ (Β«Π³Π΄Π΅ ΠΌΡ‹ сСйчас») ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ Π·Π°Π΄Π°Ρ‡ΠΈ. Если Π½ΠΎΠ²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π΅Ρ‰Π΅ Ρ…ΡƒΠΆΠ΅, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ сохранСнному Β«ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΡŽΒ» ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ вычислСния. ΠœΡ‹, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, смоТСм ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈ наши ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅ Π½Π° Ρ‚ΠΎΡ‚ случай, Ссли Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π»ΡƒΡ‡ΡˆΠ΅β€¦

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, использованиС Β«ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠΉΒ» позволяСт ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ интСрСсныС, Π³ΠΈΠ±ΠΊΠΈΠ΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ структуры. Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ посмотрим Π½Π° Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ рСкурсивный Π²Ρ‹Π·ΠΎΠ² просто ΠΊΠ»Π°Π΄Π΅Ρ‚ Π½Π° стСк Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒ. Но ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стСк, Ссли Π²Π²Π΅Π΄Π΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ-«аккумулятор». РазумССтся, ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ вычислСний аккумулятор Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π΅Π½ 1 (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ x *1 = x ).

(define (fact n)

; опрСдСляСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ вычислСния Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π»Π° с аккумулятором

(define (cfact _n acc)

(if (< _n 2)

(cfact (- _n 1) (* _n acc))

; Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с аккумулятором, Ρ€Π°Π²Π½Ρ‹ΠΌ 1

(cfact n 1)

Π’Π½Π΅ΡˆΠ½Π΅ эта функция каТСтся рСкурсивной. Однако это Π½Π΅ Ρ‚Π°ΠΊ. Π’ Π‘Ρ…Π΅ΠΌΠ΅ Π΅ΡΡ‚ΡŒ понятиС «хвостовой рСкурсии», которая Π΄Π΅Π»Π°Π΅Ρ‚ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹ΠΌΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Ρ‹. КаТдая функция, которая Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ саму сСбя Π² «хвостовой» ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ (Ρ‚.Π΅. ΠΊΠ°ΠΊ послСднСС дСйствиС) – это просто Ρ†ΠΈΠΊΠ».

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π»ΠΈ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ, Ρ†ΠΈΠΊΠ»ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ. Π•ΡΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ (тСорСтичСски Β«ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉΒ») способ Ρ‚Π°ΠΊΠΎΠ³ΠΎ прСобразования; Π½ΠΎ ΠΎΠ΄Π½Π° приятная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π‘Ρ…Π΅ΠΌΡ‹ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ эти прСобразования просты ΠΈ наглядны. ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ написаны быстро, Π΄Π°ΠΆΠ΅ Ссли ΠΏΠΎΠ½Π°Ρ‡Π°Π»Ρƒ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ памяти. ПослС ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΈΡ… нСслоТно ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ эффСктивныС – ΠΈ Ρ‚ΠΎΠΆΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅! ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ для ΠΎΠΏΡ‹Ρ‚Π½ΠΎΠ³ΠΎ программиста Π½Π° Π‘Ρ…Π΅ΠΌΠ΅ становится Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π½Π°Ρ‚ΡƒΡ€ΠΎΠΉ.

Π‘Ρ…Π΅ΠΌΠ° ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько Π²Π°ΠΆΠ½Ρ‹Ρ… прСимущСств Π½Π°Π΄ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ языками. Π•Π΅ элСгантно простая, однородная структура ΠΈ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ синтаксис позволяСт ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Ρ… «особых случаСв». Π•Π΅ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ позволяСт Π½Π΅ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя Π½Π° поиск ΠΎΠ±Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΡƒΡ‚Π΅ΠΉ: программист ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΠΎΠ½Ρ†Π΅Π½Ρ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π½ΠΎ Π½Π΅ Π½Π° Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. Π‘Ρ…Π΅ΠΌΠ° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ нСсколько стилСй программирования, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΌΠΎΠ΄Π½ΠΎΠ΅ сСгодня ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅, – Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ программист Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΡΠΏΠΎΡΠ°Π±Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ΄ Π‘Ρ…Π΅ΠΌΡƒ; ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΡΡ‚ΠΈΠ»ΡŒ ΠΈΠ»ΠΈ способ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊ. Π€ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π‘Ρ…Π΅ΠΌΡ‹ Π΄Π΅Π»Π°Π΅Ρ‚ Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ простым. ΠœΠΎΡ‰Π½Ρ‹Π΅ срСдства абстрагирования ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ части ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΎΡ‚ частСй, Β«Π·Π°Ρ‚ΠΎΡ‡Π΅Π½Π½Ρ‹Ρ…Β» ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ/Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ языка/ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ систСму. Π›Π΅Π³ΠΊΠΎΡΡ‚ΡŒ сочСтания Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ создания Π½Π° ΠΈΡ… основС Π½ΠΎΠ²Ρ‹Ρ… конструкций позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ†Π΅Π»Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΎΡ‚Π»Π°ΠΆΠ΅Π½Π½Ρ‹Ρ…, ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

Π˜Π½Π°Ρ‡Π΅ говоря, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ слоТныС, ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½ΠΎ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π° это Π³ΠΎΠ΄Ρ‹, Π‘Ρ…Π΅ΠΌΠ° – Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для успСха!

ΠšΡ€Π°Ρ‚ΠΊΠΈΠΉ список Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ извСстных Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ Π‘Ρ…Π΅ΠΌΡ‹.

Chez Scheme ΠΈ MacScheme – ΠΎΠ΄Π½ΠΈ ΠΈΠ· Π»ΡƒΡ‡ΡˆΠΈΡ… коммСрчСских Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ; ΠΎΠ΄Π½Π°ΠΊΠΎ сущСствуСт мноТСство бСсплатных ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ компиляторов Π‘Ρ…Π΅ΠΌΡ‹ ΠΊΠ°ΠΊ для ΡƒΡ‡Π΅Π±Π½Ρ‹Ρ… Ρ†Π΅Π»Π΅ΠΉ, Ρ‚Π°ΠΊ ΠΈ для ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

Одна ΠΈΠ· Π»ΡƒΡ‡ΡˆΠΈΡ… систСм для Windows ΠΈ Linux – MzScheme , ΠΈ построСнныС Π½Π° Π΅Π΅ основС MrEd (систСма создания пСрСносимого графичСского интСрфСйса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ) ΠΈ DrScheme (ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, самая удобная срСда Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈΠ· ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ…).

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Scheme ΡƒΠΏΠΎΡ€ Π±Ρ‹Π» сдСлан Π½Π° ΡΠ»Π΅Π³Π°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΈ простоту языка. Ѐилософия языка ΠΏΠΎΠ΄Ρ‡Ρ‘Ρ€ΠΊΠ½ΡƒΡ‚ΠΎ минималистская. Π•Π³ΠΎ Ρ†Π΅Π»ΡŒ - Π½Π΅ ΡΠ²Π°Π»ΠΈΠ²Π°Ρ‚ΡŒ Π² ΠΊΡƒΡ‡Ρƒ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ конструкции ΠΈ срСдства, Π° Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ² - ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ слабости ΠΈ ограничСния, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ добавлСния Π² язык Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, Scheme содСрТит ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… конструкций ΠΈ позволяСт Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ ΠΏΡƒΡ‚Ρ‘ΠΌ надстройки Π½Π°Π΄ Π½ΠΈΠΌΠΈ. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ язык ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ 2 ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»ΠΎΠ²:

  1. «остаточная» ΠΈΠ»ΠΈ «хвостовая» рСкурсия (Π°Π½Π³Π». tail recursion )
  2. ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ (Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ для сохранСния ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°).

Scheme Π±Ρ‹Π» ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π΄ΠΈΠ°Π»Π΅ΠΊΡ‚ΠΎΠΌ Лиспа , ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ статичСскиС (Π° Π½Π΅ динамичСскиС) области видимости ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ хвостовой рСкурсии ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌ Π΄Π°Π½Π½Ρ‹Π΅ булСвского Ρ‚ΠΈΠΏΠ° (#t ΠΈ #f вмСсто Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ Π½Π΅ΡƒΠΊΠ»ΡŽΠΆΠΈΡ… T ΠΈ NIL). Он Ρ‚Π°ΠΊΠΆΠ΅ Π±Ρ‹Π» ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΏΠ΅Ρ€Π²Ρ‹Ρ… языков, нСпосрСдствСнно ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… продолТСния (Π°Π½Π³Π». continuations ). Начиная со спСцификации R^5RS, язык ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Π» ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΡ‰Π½ΠΎΠ΅ ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ΅ срСдство для записи макросов Π½Π° основС шаблонов синтаксичСского прСобразования с «соблюдСниСм Π³ΠΈΠ³ΠΈΠ΅Π½Ρ‹Β» (Π°Π½Π³Π». hygienic_macro ). Π’ Scheme Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° «сборка мусора Β» (Π°Π½Π³Π». garbage collection ), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ автоматичСскоС освобоТдСниС памяти ΠΎΡ‚ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Π’ качСствС Π±Π°Π·ΠΎΠ²Ρ‹Ρ… структур Π΄Π°Π½Π½Ρ‹Ρ… язык ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ списки ΠΈ ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹Π΅ массивы (Β«Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹Β»). Π’ соотвСтствии с Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΠ·ΠΌΠΎΠΌ, (ΠΏΠΎΠΊΠ°) Π½Π΅Ρ‚ стандартного синтаксиса для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ структур с ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ полями, Π° Ρ‚Π°ΠΊΠΆΠ΅ срСдств ООП - всС это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ программистом ΠΏΠΎ Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΡŽ, хотя Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ языка ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹.

Как ΠΊΡƒΡ€ΡŒΡ‘Π·, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ языка Schemer Π±Ρ‹Π»ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΎ Π½Π° настоящСС ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³Π΄Π°ΡˆΠ½Π΅Π³ΠΎ ограничСния Π½Π° Π΄Π»ΠΈΠ½Ρƒ ΠΈΠΌΡ‘Π½ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ITS.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΎΡΡ‚Ρ‹Π΅ матСматичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ

(+ 2 (* 2 2 ) ) (+ 1 2 3 4 )

Π’Ρ‹Π·ΠΎΠ² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ) прСдставляСтся списком, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ символ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, Π² сущности, являСтся ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ) всСгда Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ.

ΠŸΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Ρ‹ Ρ‚ΠΈΠΏΠ°

(number? 5 ) (number? "foo" ) (string ? "foo" )

По соглашСнию, ΠΈΠΌΠ΅Π½Π° всСх ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΎΠ² Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ символом? .

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° равСнство

(eq? "foo" "bar" ) (eq? 5 (+ 2 3 ) ) (eq? (eq? 2 3 ) (eq? 3 4 ) )

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ макросов для Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ push/pop

(define-syntax push! (syntax-rules () ((push! x l ) (set! l (cons x l ) ) ) ) ) (define-syntax pop! (syntax-rules () ((pop! l ) (let ((x (car l ) ) ) (set! l (cdr l ) ) x) ) ) )

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

;; Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» Π² (нСэффСктивном) рСкурсивном стилС (define (fact x) (if (< x 3 ) x (* (fact (- x 1 ) ) x) ) ) ;; функция Π€ΠΈΠ±ΠΎΠ½Π°Ρ‡Ρ‡ΠΈ - Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ рСкурсии (define (fib n) (cond ((= n 0 ) 0 ) ((= n 1 ) 1 ) (else (+ (fib (- n 1 ) ) (fib (- n 2 ) ) ) ) ) ) ;; сумма элСмСнтов списка Π² Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½ΠΎΠΌ для Scheme стилС ;; (Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ функция loop Π²Ρ‹Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ†ΠΈΠΊΠ» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ;; хвостовой рСкурсии ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ-аккумулятора) (define (sum-list x) (let loop ((x x) (n 0 ) ) (if (null? x) n (loop (cdr x) (+ (car x) n) ) ) ) ) (fact 14 ) (fib 10 ) (sum "(6 6 6 100 ) ) (sum (map fib "(1 2 3 4 ) ) )

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡƒ:

(define имя_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (lambda (список_Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²) (рСализация_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ) ) ) ,

хотя Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Ρ‡Π°Ρ‰Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡΠΎΠΊΡ€Π°Ρ‰Ρ‘Π½Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ:

(define (имя_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹) (рСализация_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ) ) .

Π’Π²ΠΎΠ΄ / Π’Ρ‹Π²ΠΎΠ΄

(write (+ (read ) (read ) ) )

Бсылки

РусскоязычныС ссылки

АнглоязычныС ссылки

Π£Ρ‡Π΅Π±Π½ΠΈΠΊΠΈ Π½Π° английском

  • Π’ΠΈΠ΄Π΅ΠΎ-Π»Π΅ΠΊΡ†ΠΈΠΈ Β«Structure and Interpretation of Computer ProgramsΒ» , Harold Abelson ΠΈ Gerald Jay Sussman
  • The Scheme Programming Language , R. Kent Dybvig

Wikimedia Foundation . 2010 .

Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ "Scheme (язык программирования)" Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… словарях:

    Π―Π·Ρ‹ΠΊ программирования Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Π°Ρ знаковая систСма, прСдназначСнная для записи ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π―Π·Ρ‹ΠΊ программирования опрСдСляСт Π½Π°Π±ΠΎΡ€ лСксичСских, синтаксичСских ΠΈ сСмантичСских ΠΏΡ€Π°Π²ΠΈΠ», Π·Π°Π΄Π°ΡŽΡ‰ΠΈΡ… внСшний Π²ΠΈΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ дСйствия,… … ВикипСдия