История изменений
Исправление theNamelessOne, (текущая версия) :
У меня твой код запускается в sbcl, но с ворнингами. Что следует учесть:
- Форма
let
создаёт локальные (по умолчанию лексические) привязки, которые действуют только внутри её тела, поэтому строка сlet
у тебя не производит никакого полезного эффекта setf
у тебя производит присваивание к необъявленным переменным. sbcl на это генерирует ворнинги. Переменные нужно объявить либо «глобально» (формыdefvar
илиdefparameter
), либо «локально» (формаlet
и производные, но при этомsetf
должен быть внутриlet
)- для тестирования удобнее использовать REPL
Немного переписал твой пример:
(defun read-var (name)
(format t "~&~a=" name)
(finish-output)
(read))
(defun main ()
(let* ((a (read-var "a"))
(b (read-var "b"))
(c (read-var "c"))
(d (- (* b b)
(* 4 a c))))
;; a, b, c, d видны здесь
(format t "~%D=~a~%" d)
;; Дальнейшие расчёты
)
;; a, b, c, d здесь уже не существуют
)
(main)
λ desktop /tmp → sbcl --script square.lisp
a=1
b=2
c=1
D=0
λ desktop /tmp →
Тем не менее, поведение gcl выглядит довольно странно. Попробуй sbcl.
PS. И да, в данном случае буферы лучше сбрасывать явно.
Исправление theNamelessOne, :
У меня твой код запускается в sbcl, но с ворнингами. Что следует учесть:
- Форма
let
создаёт локальные (по умолчанию лексические) привязки, которые действуют только внутри её тела, поэтому строка сlet
у тебя не производит никакого полезного эффекта setf
у тебя производит присваивание к необъявленным переменным. sbcl на это генерирует ворнинги. Переменные нужно объявить либо «глобально» (формыdefvar
илиdefparameter
), либо «локально» (формаlet
и производные, но при этомsetf
должен быть внутриlet
)- для тестирования удобнее использовать REPL
Немного переписал твой пример:
(defun read-var (name)
(format t "~&~a=" name)
(finish-output)
(read))
(defun main ()
(let* ((a (read-var "a"))
(b (read-var "b"))
(c (read-var "c"))
(d (- (* b b)
(* 4 a c))))
;; a, b, c, d видны здесь
(format t "~%D=~a~%" d)
;; Дальнейшие расчёты
)
;; a, b, c, d здесь уже не существуют
)
(main)
λ desktop /tmp → sbcl --script square.lisp
a=1
b=2
c=1
D=0
λ desktop /tmp →
Тем не менее, поведение gcl выглядит довольно странно. Попробуй sbcl.
Исходная версия theNamelessOne, :
У меня твой код запускается в sbcl, но с ворнингами. Что следует учесть:
- Форма
let
создаёт локальные привязки, которые действуют только внутри её тела, поэтому строка сlet
у тебя не производит никакого полезного эффекта setf
у тебя производит присваивание к необъявленным переменным. sbcl на это генерирует ворнинги. Переменные нужно объявить либо «глобально» (формыdefvar
илиdefparameter
), либо «локально» (формаlet
и производные, но при этомsetf
должен быть внутриlet
)- для тестирования удобнее использовать REPL
Немного переписал твой пример:
(defun read-var (name)
(format t "~&~a=" name)
(finish-output)
(read))
(defun main ()
(let* ((a (read-var "a"))
(b (read-var "b"))
(c (read-var "c"))
(d (- (* b b)
(* 4 a c))))
;; a, b, c, d видны здесь
(format t "~%D=~a~%" d)
;; Дальнейшие расчёты
)
;; a, b, c, d здесь уже не существуют
)
(main)
λ desktop /tmp → sbcl --script square.lisp
a=1
b=2
c=1
D=0
λ desktop /tmp →
Тем не менее, поведение gcl выглядит довольно странно. Попробуй sbcl.