Я попытался уменьшить его до минимального примера. Код работает без ошибок, выдавая ожидаемый результат. Но это дает мне предупреждение, что моя первая переменная не определена. Кажется, что второй оператор progn не "видит" результаты первого оператора. Спасибо за помощь!
(Изначально у меня вообще не было конструкции progn в коде, но после получения этой ошибки я добавил ее, чтобы посмотреть, приведет ли это к принудительному выполнению, но ошибка та же самая.)
Вот код:
(let ((input (open "input.lisp")))
(progn (defvar var1 (read input))
(defvar arr1 (make-array var1 :initial-contents (read input))))
(close input))
(print var1)
(print arr1)
Это содержимое файла input.lisp:
9
(10 8 6 4 2 4 6 8 10)
И это вывод, который я получаю от sbcl после выполнения (загрузить «test.lisp»):
; in: DEFVAR ARR1
; (MAKE-ARRAY VAR1 :INITIAL-CONTENTS (READ INPUT))
;
; caught WARNING:
; undefined variable: VAR1
;
; compilation unit finished
; Undefined variable:
; VAR1
; caught 1 WARNING condition
9
#(10 8 6 4 2 4 6 8 10)
T
Итак, мне кажется, что оба оператора определения выполняются, но второй не «видит» результаты первого. Он по-прежнему правильно строит массив, потому что он заполнен заданным начальным содержимым. Но почему var1 еще не определен?
defvar
) получают наушники, а не лексические переменные (объявленныеlet
). Это всего лишь соглашение, так что вам не нужно следовать ему, если оно вам не нравится, но об этом стоит знать, если вам когда-нибудь понадобится читать код, написанный другими программистами на Лиспе. - person Gareth Rees   schedule 04.07.2011