если условие в GNU CLISP - PullRequest
0 голосов
/ 15 мая 2018

Мне нужна помощь, мой код не возвращает хороший ответ, когда я сам ввожу значения в интерпретаторе. Вот мой код:

(defun compromis() 
  (flet ((prompt (string)
           (format t "~&~a: " string)
           (read nil 'eof nil)))
    (print "Enter values :")
    (let ((E (prompt "tddv_estime"))
          (W (prompt "tddv_worst"))
          (C (prompt "gisement_courant"))
          (M (prompt "gisement_max"))
          (m (prompt "gisement_min")))
      (if (> E W)
          (if (> C m)
              (print "Decrement")
              (print "Error")))
      (if (< E W)
          (if (< C M)
              (print "Increment")
              (print "Nothing"))))))

Когда я должен прочитать «Приращение» с E=8, W=16, C=2, Max=8 и Min=1, у меня "Nothing" отображается дважды ...

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Проблема, которую я обнаружил с вашим кодом во время компиляции:

; caught ERROR:
;   The variable M occurs more than once in the LET.

Это потому, что Common Lisp (в общем) нечувствителен к регистру - считыватель преобразует все символы в верхний регистр, поэтому при чтении кода m становится M. Вы можете создавать символы нижнего регистра (используя, например, синтаксис |m|), но это не очень распространено.

Когда вы переименовываете M и m, например, Mx и mi - код работает должным образом, печатает Increment.

0 голосов
/ 15 мая 2018

Вы видите "Nothing" дважды, потому что print оба отпечатки и возвращает свой аргумент и, поскольку это последняя форма в вашей функции compromis, возвращает значение, возвращаемое print. Поскольку вы оцениваете код в REPL (Read-Eval- Print Loop), Вы видите распечатку и возвращаемого значения.

PS. Обратите внимание, что lispers читает код по отступу , а не по счету парен. Я отредактировал вашу функцию в соответствии с общими стандартами кодирования (фактически, Emacs сделал это для меня).

...