LINUX.ORG.RU

История изменений

Исправление 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.