‮Сдвиг по фазе (kincajou) wrote,
‮Сдвиг по фазе
kincajou

Ботанизм-програмизм (2).



Calling anonymous function:
Arguments: ( X )
Code: ( IF X *X* "Nay" )
---[ Context 0x51fc200 BEGIN ]---
Level 0x51fc200:
LAMBDA-RESULT: "Alphadog"
lambda: ( ( X )
-> ( IF X *X* "Nay" )
)

*X*: "Alphadog"
----[ Context 0x51fc200 END ]----


Переменная LAMBDA-RESULT содержит результат вызова безымянной функции ( ( X ) -> ( IF X *X* "Nay" ) ), которой был передан булев T (не показан) в качестве аргумента. Переменная *X* содержит строку "Alphadog", находится она на более высоком уровене видимости - поэтому функция может обращаться к ней по имени и возвращать как результат. Собсно, как и получилось. А внутри функции - обращение к специальному оператору IF.

И вот ещё так можно:
( DEFSYM L ( () ( YES ) ) )
Это абсолютно идентично такой записи:
( DEFUN L () ( YES ) )
(создаётся функция без аргументов, которая вызывает функцию YES, всегда возвращающую булево T). Ничего удивительного, конечно.
Вернее, удивительно то, что это таки работает. А просто
( DEFSYM L 1 )
создаст символ L со значением 1.

Операторы от функций внешне отличаются мало, особенно если невнимательно смотреть. А по факту - операторы это такие штуковины, механизм вызова коих в каждом случае уникален. Функции все "выглядят" как пара из ( (списка аргументов) и (некоего вычисляемого значения) ), а вот операторы - кто во что горазд, ни одного одинакового. Впрочем, у меня их всего пока три :) IF, PROGN, DEFSYM (остальное надо написать - циклы, цитирование, вычисление типов и т.п. Правда, PROGN выглядит неким анахронизмом, то в CL он есть и это особо никого не смущает - зато с этой обёрткой проще работать со списком инструкций (т.е. когда возвращаемое значение вычисляется не одним вызовом, а несколькими последовательными действиями)
Tags: uncommon lisp
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments