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

Category:

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

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

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

---
* То есть, эта ссылка позволяет видеть из функции символы, существующие в системе на момент создания самой этой функции. Если какие-то символы были созданы после неё, тогда у нас проблема - мы их не увидим. И это одно из тех нескольких неясных мест, которое я пока не знаю, как сделать яснее. А смысл затеи в том, чтобы функция могла бы "связать" своё окружение с собой же - если я пойму, как это правильно сделать, то концепция замыканий (closures) реализуется как бы сама собой. Но, видимо, простой способ для решения такой задачи плохо подходит - см. выше по какой причине.
Tags: uncommon lisp
Subscribe
  • Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 1 comment