LINUX.ORG.RU

Имплементация defvar.


0

0

Доброго времени суток.

Вопрос у меня возник по поводу имплементации defvar в различных реализациях
lisp:

CLISP:

[1]> (setq x 100)
100
[2]> (defun first0 (x)
       (second0 2))
FIRST0
[3]> (defun second0 (y)
       (list x y))
SECOND0
[4]> (first0 1)
(100 2)
[5]> (defvar x)
X
[6]> (first0 1)
(1 2)

Тут, собственно, претензий нет, все как и предполагается, в первом случае
переменная x -- статическая. поэтому используется глобальное значение, во
втором случае она стала динамической, и в качестве ее значения был использован
фактический параметр функции first0.

SBCL (варнинги поскипаны):

* (setq x 100)

100
* (defun first0 (x)
    (second0 2))

FIRST0
* (defun second0 (y)
    (list x y))   

SECOND0
* (first0 1)

(100 2)
* (defvar x)

X
* (first0 1)

(100 2)

Напрашивается резонный вопрос: почему переменная `х' не стала динамической?
anonymous

Э не, она не статическая, а лексическая. И вообще, setq из top level'а не определено, какой тип связи создавать. Так что этот код кривой.

stassats ★★★★
()
Ответ на: комментарий от stassats

Хм, ну в общем-то да, просто в двухтомнике финских авторов лексические переменные и статические используются как синонимы...

anonymous
()
Ответ на: комментарий от anonymous

Кстати, еще, почему код выдавал разный результат: http://www.lisp.org/HyperSpec/Body/sec_3-2-2-3.html

> Special proclamations for dynamic variables must be made in the compilation environment. Any binding for which there is no special declaration or proclamation in the compilation environment is treated by the compiler as a lexical binding.

То есть объявление переменных специальными в режиме интерпретации не определено. http://clisp.cons.org/impnotes/compilation.html#semantic-constraints

CLISP по дефолту интерпретирует.

stassats ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.