За схема език за програмиране

За езика за програмиране Схема

0. Малка влизане.

Тази бележка е посветена на език за програмиране (PL) Схема.

Схема както multiparadigm Lisp е език за програмиране "почти няма синтаксис", разработена в Масачузетския технологичен институт. Някои се обадите на Схема езика на функционално програмиране (FP), като по този начин тя се равнява на чисто функционален език в подобие на Haskell, обаче, въпреки факта, че схемата ви позволява да пишете код в стила на PC, се приравнява правилно. По-точно и подробно описание на езика, на който може да намерите в Уикипедия, там и да намерят някои по-полезни връзки.

Както и преди написването на тази статия ми е останало, някои от тях по няколко форуми в мрежата, това, първо, на бележка в този блог ще бъде относително по-дълъг от следващия и да се състои от по-горе бележки на форумите.

1. Няколко думи за "почти без синтаксис".

За разлика от по-чести и познат PL, като C, C ++, Pascal, Java, PHP, и така нататък. Г. В схема и Lisp използва функциите на запис върху префикс и операторите, както и огромен брой скоби, които могат да възпре новодошлите от изучаването на езика, но колкото по-далеч и да отидете в кабинета на схемата, толкова повече ще се разбере, че това е много удобна форма на писане, който се отваря големи възможности за манипулиране на код и данни. Но не изключи ефектът от по-нататъшно отхвърляне =). В този случай, погледнете назад, когато тя се използва полски, постфиксната бройна система, тя ще изглежда още по-необичайно и отблъскваща =).

Така че, ето някои примери в програми схема:

(* 1 2 3 4 5); Продуктът на числата от 1 до 5

Както можете да видите, синтаксисът е много редовен и почти не се предлага, всяка функция разговор има следната форма:

(Funcname ARG1 ARG2 arg3. ArgN)

нарича S-експресия. Границите на формата са скобите и ограничени имената - празно пространство (пространство, и в раздела за нов ред). Първият символ се тълкува като извикване на функция, свързано с него за останалата част от изчислените стойности, свързани с тях, с нея, без значение каква е стойността - функция или, например, числова константа, така че прехвърлянето на функции като параметри на други функции, е прост и не развалят синтаксис, например:

2. малко за списъци.

Основната структура на данните в схемата, както и в Lisp, списък. Основните функции на работа със списъци:

(минуси 1 от 2); връща стойност двойка: (1. 2)
(минуси 1 # 039 ()); връща списък с един елемент (1)
(Списък 1 2 3); Връща списък със стойности: (1 2 3)
(минуси 1 (минуси 2 (минуси 3 # 039 ()))); връща списък на стойностите: (1 2 3)
(Кола (списъка 1 2 3)); връща стойност на първия елемент (главата) списък (1 2 3): 1
(CDR (списъка 1 2 3)); Тя връща списък, започващ с втория елемент (опашка) списък (1 2 3): (2 3)

дизайн # 039 () означава празен списък, символът # 039 представлява цитирането е синтактична захар за единствено число (цитат).. Например поканата функция

(Списък 1 2 3); може да бъде заменен с дизайн:
039 # (1 2 3)

Въпреки това, те не трябва да се бърка по отношение на вида на номера, константи ценности, цифри струни затворени в двойни кавички, двата израза са равни, но по отношение на символите, свързани с който и да е стойност, дават различни резултати, като например:

(Да ((х 1) (Y 2) (Z 3)); Нека х = 1, у = 2, Z = 3, тогава:
(Списък х Ш Щ)); ще върне списък на променливи X, Y и Z: (1 2 3)
(Да ((х 1) (Y 2) (Z 3))
# 039 (х Ш Щ)); ще върне списък на символи х Y и Z: (х Ш Щ)

3. макроси.

Макроси ви позволяват да се създаде нова специална форма, като по този начин за удължаване на синтаксиса на езика. Например:

(Определяне-синтаксис ми-ако; Декларирам синтаксис име
(Синтаксис-правила (след друг); описват правилата: първия списък - (след друг) -
; Ние списък на думите, които не са изчислени, а ла "запазени думи"
; в списъка по-долу описва шаблони, които ще обработва макроса
; и правилни товарачи:

((_ Състояние след това по-вярно друг по-фалшива); тук описва модел дизайн: _ - тук заместен макро име,
; можете да пишете ми-ако вместо _. няма разлика
; след това и друго както описахме по-рано само една дума,
; състояние, по-истински и по-фалшиво - така да се каже локалните променливи в макро,
; изрази прехвърлени към тях - се изчисляват
(Ако състоянието на-вярно по-невярно)); и този шаблон манипулатор. Шаблоните могат да бъдат повече, например, можете да добавите още 2:
((_ Състояние след това по-вярно)
(Ако състоянието на-вярно))
((_ Състояние друг он-невярно)
(Ако (не състояние) по-невярно))
)); тук близки списъци специфични форми на синтактични-правила и определи-синтаксис.

; Сега ние можем да използваме изобретил макро:
(My-ако (> 02 април) след това (дисплей "Y \ Н") друг (дисплей "N \ Н"))
(My-ако (> 02 април) след това (дисплей "Y \ Н"))
(My-ако (> 02 април) друг (дисплей "Y \ Н"))

Използвайте само дефиницията на функцията не би било тук, тъй като стойностите на аргументите на функцията се оценяват преди да бъде предадена на функция т. Е. Бихме във всеки случай, програмата ще бъде взето от оператора на двата клона, независимо от стойността на аргумента-условия и за да се избегне това, ние трябваше да за всеки път, когато изрично преминаване през функция аргументи клонове (закъснение.). Аз спаси изчисляването на неговата теза.

Друг пример, показващ изпълнение на операторите и ++, i--, х + = Y, X - = Y, X * = у и х / = у, съдържащ включително елементи на мета-програмиране: макро себе си грим оп създава макроси за нас определяне на последните четири оператори:

(Определяне-синтаксис направи
(Синтаксис-правила ()
((_ Op функция)
(Определяне-синтаксис оп
(Синтаксис-правила ()
((_ X у)
(Започнете (настроен! X (функционален х ш)) х)))))))

(Определяне-синтаксис ++
(Синтаксис-правила ()
((_ I)
(Започнете (настроен! I (+ аз 1)) и))))

(Определяне-синтаксис -
(Синтаксис-правила ()
((_ I)
(Започнете (комплект I (- I 1)) и))))

(Определяне x1 2)
(Определяне х2 3)
(Съобщение "х1 =" х1 "х2 =" х2)
(++ х1)
(+ = Х2 (- х2))
(Съобщение "х1 =" х1 "х2 =" х2)
(+ = X1 х2) (съобщение "х1 =" х1)
(* = X1 х2) (съобщение "х1 =" х1)
(- = x1 x2) (съобщение "х1 =" х1)
(/ = X1 х2) (съобщение "х1 =" х1)

4. козина, затворени участъци и по-високи функции ред.

Сега primerchik с козина (привеждане на функцията на п аргументи за функция на един аргумент, връща функция на N-1 аргументи) и по-висок ред функции (функции, които работят на други функции):

(Определяне (грим Val-списък v0 DV Вн)
(Определяне (грим списък обем)
(Ако (= о ил)
(Минуси об # 039 ())
(Против V (грим списък (+ V DV)))))
(Направете списък v0))

(Определяне на А-списък (направи-Val-списъка 1 1 3))
(Определяне на х-списък (направи-Val-списък 0,2 0,1 1,2))

(Определяне (у А)
(Ламбда (X) (- (* A х) (тен (* пи (/ х 4))))))

(Определяне на у-списък (карта (ламбда (А)
(Карта (у А) х-списък))
A-списък))

(На дисплея (карта (ламбда (LS) (макс прилагат LS)) у-списък))

В този код, функцията на (х, А) се редуцира до у функция (А), време на възстановяване на функция по (х), т.е. тя може да се прилага, както следва:

(Да ((А1 1) (х1 0.2))
((Y А1) х1))

Козина много подобен на веригата, както аз го разбирам, само вината е показан в следните стъпки:

(Определяне y1 (Y 1)); създаване на функция (Y 1 х) = (- (* 1 х) (тен (* пи (/ х 4))))
(Определяне y2 (у 2)); създаване на функция (Y 1 х) = (- (* 2 х) (тен (* пи (/ х 4))))
(Y1 х1)
(Y2 х1)

В примера се използва по-висок порядък функции карта и се прилагат, те работят, както следва:

1) карта предаваната тя се прилага като функция на аргумента предава на всеки елемент в списъка предава от втория аргумент и връща списък на стойностите rezultattov приложение, например

(Определяне на тест-списък # 039 (-2 1 7 0 -5 4))
(Карта корема тест-списък); ще върне списък на абсолютните стойности на тест-списък LOV: (2 1 7 0 5 4)

2) се прилага прилага предадения й като първи аргумент към елементите на списъка, предавани от втория аргумент,
като пъпка те (елементи от списъка) са параметри прехвърлят функции, такива функции

(Max -2 1 7 0 4 -5); \
(+ -2 1 7 0 -5 4); _vernut максимална стойност и сумата на стойностите, предавани като параметри, съответно.

а е опит да ги доведе до по следния начин:

(Max тест-списък). \
(+ Тест-списък); _vydast грешка.

Това не е много полезно, когато, например, в хода на програмата генерира списък със стойности, от които след това трябва да изберете максималната стойност, или сумата от броя. И тогава става въпрос за помощта прилага функция, която разкрива как-да се изброят, т.е.. Д. Expression

(Прилагане макс тест-списък); \
(Прилагане + тест-списък); _ekvivalentny изрази
(Max -2 1 7 0 4 -5); \
(+ -2 1 7 0 -5 4); _sootvetstvenno.

И в крайна сметка се върна в козина. Както се вижда от описанието на функцията на картата, той може да работи само функции на една променлива. Именно тогава до нас и дойде на помощ = козина и затваряне).

5. Малко за функциите и макроси с произволен брой аргументи.

Както може би сте забелязали, някои от функциите и формите могат да се вземат на произволен брой аргументи, като например:

(+ 1 2 3)
(+ 1 2 3 4)
(И exp1 exp2)
(И exp1 exp2 exp3 exp4)

За да създадете такава функция, трябва да използвате точка за запис аргументи, като например:

(Определяне (съобщение глава. Tail)
(Display главата)
(За-всяка опашка езика)
(Нов ред))

В това определение на функцията първият аргумент ще бъде приет, за да го директно, ръководителят на параметъра, а всички останали - опашката на списъка. Той използва друга функция от по-висок ред за-всеки, който се прилага функцията премина като първи аргумент за всеки елемент от списъка, предаден от втория аргумент, но за разлика от функцията картата не връща стойност. Сега можете да използвате функцията за съобщение:

(Съобщение "Hello World!")
(Нека ((свят "World"))
(Съобщение "Hello" свят "!"))

Определяне на формата, която се произволен брой аргументи, че е възможно по този начин:

(Определяне-синтаксис и
(Синтаксис-правила ()
((_) #t)
((_ Е) д)
((_ Е1 е2 e3).
(Ако е1 (е2 и e3.) #F))))

След това можете да използвате новата форма, както следва:

Това заключава моя преглед. Надявам се, че той е бил / ще бъде за някой полезен за някой интересен. =)