((EQ (CAR e) 'COND ) (EVCON (CDR e ) al ) )
(T (apply (CAR e) (evlis (CDR e) al ) al ) )
) )
(DEFUN APPLY (fn args al )
(COND
((EQ e NIL ) NIL )
((ATOM fn )
(COND
((MEMBER fn '(CAR CDR CONS ATOM EQ )) (SUBR fn agrs al ))
(T (APPLY (EVAL fn al ) args al ))
) )
((EQ (CAR fn ) 'LABEL )
(APPLY (CADDR fn )
Args
(CONS (CONS (CADR fn ) (CADDR fn ))
al ) ) )
((EQ (CAR fn ) 'FUNARG )
(APPLY (CDR fn ) args (CADDR fn))
)
((EQ (CAR fn ) 'LAMBDA )
(EVAL (CADDR fn )
(APPEND (PAIR (CADR fn ) args ) al ))
(T (APPLY (EVAL fn al ) args al ))
) )
Assoc, append, pair, list таърифлари – стандартлардир.
Eval-p ва apply-p операторлари худди шундай вазифани таъминлаб беради, улар доимий қийматлар ва функционал таърифларни сақлаш учун атом хоссалари рўйхатларидан фойдаланишга асосланган. Aтом хоссалари рўйхатидаги category индикатори алоҳида тоифага мансуб функцияларни талқин қилиш қоидасини, macro эса функцияни тақдим этишнинг маълум бир усулини билдиради. Value функцияси атомларнинг контекстига ва хусусиятларига қараб ўзгарувчининг жорий қийматини топиш усулларини амалга оширади.
(defun eval-p (e c)
(cond ((atom e) (value e c))
((atom (car e))(cond ((get (car e) 'category)
((get (car e) 'category) (cdr e) c) )
(T (apply-p (car e)(evlis (cdr e) c) c))
) )
(T (apply-p (car e)(evlis (cdr e) c) c))
))
(defun apply-p (f args c)
(cond ((atom f)(apply-p (function f c) args c))
((atom (car f))(cond ((get (car f) 'macro)
(apply-p ((get (car f) 'macro) (cdr f) c) args c))
(T (apply-p (eval f e) args c))
) )
(T (apply-p (eval f e) args c))
))
(defun eval-p (e c)
(cond ((atom e) (value e c))
((atom (car e))(cond ((get (car e) 'category)
((get (car e) 'category) (cdr e) c) )
(T (apply-p (car e)(evlis (cdr e) c) c))
) )
(T (apply-p (car e)(evlis (cdr e) c) c))
))
(defun apply-p (f args c)
(cond ((atom f)(apply-p (function f c) args c))
((atom (car f))(cond ((get (car f) 'macro)
(apply-p ((get (car f) 'macro) (cdr f) c) args c))
(T (apply-p (eval f e) args c))
) )
(T (apply-p (eval f e) args c))
))
Ёки ёрдамчи параметрларга умумий ифодаларни жойлаштириш билан бир хил нарса:
(defun eval-p (e c)
(cond ((atom e) (value e c))
((atom (car e)) ((lambda (v) (cond (v (v(cdr e) c) )
(T (apply-p (car e)(evlis (cdr e) c) c))
)) (get (car e) 'category) ) )
(T (apply-p (car e)(evlis (cdr e) c) c))
))
(defun apply-p (f args c)
(cond ((atom f)(apply-p (function f c) args c))
((atom (car f)) ((lambda (v) (cond (v (apply-p (v (cdr f) c) args c))
(T (apply-p (eval f e) args c))
) ) (get (car f) 'macro) ) )
(T (apply-p (eval f e) args c))
))
Тафсифнинг бундай таърифи билан дастурлаш тизимини кенгайтириш атомлар ва функцияларнинг тегишли хусусиятларини оддий кириш / олиб ташлаш орқали амалга оширилади.
Лисп ва унга оид тилларнинг уч юздан ортиқ турлари мавжуд ва улар фаол ишлатилади: Interlisp, muLisp, Clisp, Sheame, ML, Cmucl, Logo, Hope, Sisal, Haskell, Miranda ва бошқалар.
Жон Маккарти (1958) томонидан ишлаб чиқилган компютерлар ёрдамида томонидан маълумотларни символли қайта ишлаш концепцияси Черча ва бошқа математикларнинг фикри 1920 йилларнинг охирларидан бери ламбда ҳисоби деб номланган. Маккарти функцияларни дастурлашда юзага келадиган бошқа барча тушунчаларни табиий равишда қисқартириш мумкин бўлган умумий асосий тушунча сифатида кўриб чиқишни таклиф қилди
Функцияларни амалга ошириш, ўзлаштиришлардан асоссиз фойдаланишни рад этиш ва бошқарувни узатиш нуқтаи назаридан ҳисоб-китобларни паст даражадаги бошқариш билан тавсифланади. Бундай функциялар тавсифлаш контекстининг мустақиллиги ва аниқ таъкидланган аниқ натижани афзал кўрганлиги сабабли отладка ва синов учун қулайдир. Тўғри аниқланган функциялардаги композицияларни отладка қилишнинг мураккаблиги мултипликативлигидан эмас, балки қўшимча равишда ўсиб боради.
“Структуравий дастурлаш” нинг концептуал ўхшаш ғоялари ўн йилдан кўпроқ вақт ўтгач шаклланган.
Кроме обычных функций, аргументы которых вычисляются предварительно, в ряде случаев можно рассматривать и реализовывать специальные функции, способные обрабатывать аргументы нестандартным способом по любой заданной схеме.
В качестве результата функции допускаются варианты значений, равноправно выбираемые из конечного множества значений, подобно псевдослучайным числам.
Организация управления, достаточного для оптимизации и программирования параллельных процессов, реализуется с помощью так называемых <замедленных> или <ленивых> вычислений (lazy evaluation) рецептов, каждый вычисляется не более чем один раз и то если его результат действительно нужен.
Здание функционального программирования получает логическое завершение на уровне определения функций высших порядков, удобных для синтаксически управляемого конструирования программ на основе спецификаций, типов данных, визуальных диаграмм, формул и т.п.
От первых сообщений Джона Мак-Карти о замысле языка символьной обработки (1958) и авторских проектов первых Лисп-систем (1960-1962) - через демонстрацию принципиальной решаемости проблем искусственного интеллекта (1964), разрешение теоретических парадоксов (1972-1974) [5], разработку признанных стандартов (1972-1980), построение специализированных диалектов и создание практичных реализаций для широкого спектра различных применений - до появления Лисп-компьютеров (1978), систем математической обработки информации (1965-1990), визуальных и сверхэффективных Лисп-систем (1992-2002) идеи Лиспа выдержали многогранную шлифовку, достойную самой высокой оценки специалистов. Написанная Дж.Вейценбаумом на Лиспе программа-собеседник “Элиза”, имитирующая речевое поведение психоаналитика, дала положительный ответ на вопрос о возможности искусственного разума.
Многие реализационные находки Лиспа, такие как ссылочная организация памяти, “сборка мусора” для повторного использования памяти, частичная компиляция программ с интерпретацией промежуточного кода, полиморфизм, длительное хранение атрибутов объектов в период их использования и т.д. перекочевали из области исследований и экспериментов на базе Лиспа в практику реализации операционных систем и систем программирования.
Do'stlaringiz bilan baham: |