Начало на реферати

Увод във функционалното програмиране


`(1 ,@(list (+ 3 4) 8)). Знакът ,@ означава, че следващият го израз се оценява и оценката му трябва да е списък. Този списък се включва в "разграден" вид (без най-външните скоби) в съответния списък от по-високо ниво, т.е. той бива заместен от поредицата от елементите си в оценката на обръщението към специалната форма quasiquote.

Примери

> `(1 ,(list (+ 3 4) 8))

(1 (7 8))

> `(1 ,@(list (+ 3 4) 8))

(1 7 8)

> `(1 ,(list (* 8 5)) ,@(list (* 8 5)))

(1 (40) 40)

> `(list 1 ,@(map 1+ '(1 2 3)))

(list 1 2 3 4)

> `((1 ,@(list 2 3)) 4)

((1 2 3) 4)

> (list 1 '(2 3) `(4 ,(* 5 6) ,@(cons 7 '(8 9))))

(1 (2 3) (4 30 7 8 9))

> (define b '(1 2))

b

> `(b ,b ,(cdr b) ,@(cdr b))

(b (1 2) (2) 2)

> `(,@(append b '(3 4)))

(1 2 3 4)

3. ДЕФИНИРАНЕ НА НОВИ СПЕЦИАЛНИ ФОРМИ ЧРЕЗ MACRO

И QUASIQUOTE

Най-често правилата за преобразуване (rewriting правилата) в macro дефинициите се конструират с помощта на специалната форма quasiquote (с помощта на backquote нотацията). Така например, специалната форма name!, която дефинирахме в т. 1, може да бъде дефинирана по-лесно и разбираемо по следния начин:

(macro name!

(lambda (expr) `(set! ,(caddr expr) ,(cadr expr))))

Като заключителен пример ще дефинираме нова специална форма, която ще наречем unless. Специалната форма unless ще има два аргумента. Ако оценката на първия аргумент е false, ще се оцени вторият аргумент и неговата оценка ще се върне като оценка на обръщението към unless; в противен случай оценката на обръщението към unless ще бъде false. Следват два примера, които илюстрират очакваното поведение на unless:

> (unless (= 0 0) 'hello)

()

> (unless (= 0 1) 'hello)

hello

Увод във функционалното програмиране facebook image
Публикувано от: Радослав Макавеев

Увод във функционалното програмиране 9 out of 10 based on 2 ratings. 2 user reviews.