Запретить вывод терминала в LISP

Я хочу запустить функцию, но не выводить результат в терминал. Например, (set 'A 'B) обычно возвращается B в консоли вроде следующего:

 >>> (set 'A 'B)
 B
 >>> A
 B

Я не хочу, чтобы это что-то возвращало; Я все еще хочу, чтобы функция делала то, что должна, просто тихо:

 >>> (set 'A 'B)
 >>> A
 B

3 ответа

Решение

Это не идеально, но вы можете использовать (значения) в конце вашего выражения для подавления вывода. Вместо этого вы получите пустую строку.

Common Lisp:

(progn (set 'A 'B) (values))

Я не уверен в эквиваленте в Схеме.

LISP REPL всегда печатает некоторое возвращаемое значение. Если вам действительно не нужен вывод, вы можете запустить свой код как скрипт в терминале.

Пример:

#!/path/to/interpreter
(set 'A 'B)
[rest of program]

Поскольку напечатанное значение фактически является возвращаемым значением вашей функции, а возвращаемое значение функции является значением последнего вычисленного выражения, вы можете просто добавить инструкцию "empty" (возвращая, например, "") в конце / после вашего вызов.

Я пришел к тому же решению, что и user1613254, однако для этого я создал макрос (он есть в моем.sbclrc):

(defmacro m-ignore (fun &body body)
"ignores the return value of a function"
  `(progn (,fun ,@body) 
  (values)))

Вы используете это так:

(m-ignore format t "text")

Выход будет:
текст

вместо:
текст
NIL

который будет напечатан при использовании

(format t "text")
Другие вопросы по тегам