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

Category:

Чё-то сделал.

Придумал, как объявлять функции.
Не уверен, что правильно придумал, но оно даже работает, только я уже не совсем не понимаю - как именно:
LAMBDA created: ( ( ( ( F ) ( WISKEY . 0 ) ( XRAY . 1 ) ) ) ( C ) ( IF C "Yes" "No" ) )
current state of environment: ( ( ( F . [LAMBDA]:0021 ) ( WISKEY . 0 ) ( XRAY . 1 ) ) )
eval ( F XRAY ): Evaluating: ( F XRAY )
Lambda args: ( C )
Lambda code: ( IF C "Yes" "No" )
Evaluating: ( IF C "Yes" "No" )

Operator IF:
Cond: C
if_true: "Yes"
if_false: "No"
Eval(cond): 1
"Yes"
eval ( F WISKEY ): Evaluating: ( F WISKEY )
Lambda args: ( C )
Lambda code: ( IF C "Yes" "No" )
Evaluating: ( IF C "Yes" "No" )

Operator IF:
Cond: C
if_true: "Yes"
if_false: "No"
Eval(cond): 0
"No"
environment after: ( ( ( F . [LAMBDA]:0021 ) ( WISKEY . 0 ) ( XRAY . 1 ) ) )


В окружении созданы переменные XRAY со значением 1 и WISKEY со значением 0, потом там же создана переменная F, которой присвоено не просто значение, а функция от переменной C, которая вызывает оператор IF и, в зависимости от значения C, возвращает "Yes" либо "No".

И эту функцию я вызываю два раза, первый раз передаю ей символ XRAY, второй раз WISKEY.

Структура, которая лежит внутри типа LAMBDA, хранит ссылку на окружение, каким оно было на момент создания этого объекта*, список параметров и собственно код. Когда функция вызывается, то сначала текущее окружение запоминается в отдельной переменной, затем создаётся новый уровень окружения, в нём создаются новые символы (по списку параметров) и им присваиваются значения из списка переданных функции аргументов. Затем вычисляется код, уже в "отретушированном" окружении. После этого окружение восстанавливается в первоначальное состояние, а вычисленная величина возвращается... куда-то там.

Тут ещё масса неясностей и недоделок, но, в принципе, это чучело уже шевелится!

---
* То есть, эта ссылка позволяет видеть из функции символы, существующие в системе на момент создания самой этой функции. Если какие-то символы были созданы после неё, тогда у нас проблема - мы их не увидим. И это одно из тех нескольких неясных мест, которое я пока не знаю, как сделать яснее. А смысл затеи в том, чтобы функция могла бы "связать" своё окружение с собой же - если я пойму, как это правильно сделать, то концепция замыканий (closures) реализуется как бы сама собой. Но, видимо, простой способ для решения такой задачи плохо подходит - см. выше по какой причине.
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 

  • 1 comment