LINUX.ORG.RU

[CL] Локальные переменные и функции


0

1

Чем отличаются локальные переменные и функции, определенные через defvar и defun от let/let* и flet/labels? (последние я буду для краткости записывать *-let)

Я понимаю, что первые локальны внутри функции, в которой они определены, вторые - внутри *-let-формы. Неужели это единственное отличие? У let есть дополнительная плюшка - временное перебиндивание внешних переменных; у flet этого нет, отчего его использование для меня становится еще более загадочным.

Ок, в глобальном скопе или даже в очень большой функции может понадобиться в двух разных местах иметь две функции или переменные с одинаковыми именами, тут хоть и с натяжкой еще можно предположить полезность *-let.

До поры, до времени я особо не акцентировал на этом внимания, но, полистав некоторые наобум взятые исходники, обнаружил, что везде предпочитают писать так:

(defun foo (x)
 (labels ((foo-req (depth)
	   ...))
  (foo-req 0)))

вместо более (для меня) логичного:

(defun foo (x)
 (defun foo-req (depth)
  ...)
 (foo-req 0))

Чувствую, что неспроста пишут именно так, но понять, почему, не могу. Ведь дело не в том, что десяток лишних скобок придает большей брутальности написанному коду? :)

Если я думаю по-сишному, и непонимание исходит из этого, прошу помочь переместить точку сбо^W^W^Wначать мыслить в нужном русле.

★★★★★
Ответ на: комментарий от mv

Арргх!

Я неправильно писал тестовые примеры.

(defun x ()
 (defun xx ()
  (format t "hello~%")))

После этого делал (xx) и получал ожидаемый андефайнд ля-ля. Предварительный вызов (x) все расставил на свои места. С defvar все аналогично.

Спасибо.

staseg ★★★★★
() автор топика
Ответ на: Арргх! от staseg

Так вроде бы defun биндит функцию всегда в топлевел, а flet/labels именно локально.

(defun x ()
 (defun xx ()
  (format t "hello~%")))

все равно, что просто

(defun xx ()
  (format t "hello~%"))

только не сразу а при вызове функции x

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Да-да-да, в том то и дело. Я сказачто протупил.

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

> defun функцию в глобальном окружении определяет, flet/labels - в локальном.
А вроде же есть какая-то тонкость с defun-ами в ненулевом лексическом окружении. Я её не знаю,потому что никогда не пишу defun в defun-е. Ты такой умный, может просветишь и меня заодно?

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

«Что вы, что вы! Я такое же быдло, как и вы!» ;)

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