Функция выводит список, но возвращает ноль - PullRequest
0 голосов
/ 24 сентября 2019

Я вызываю функцию, которая выводит список, который я хочу использовать впоследствии.Я пытаюсь привязать вывод функции к переменной, но вместо списка ей присваивается NIL.

Мой вызов и вывод (обратите внимание на перевод строки в выводе):

(nqthm-eval `(myghs 1 NIL ,g1)) ==> '(T (B . E) (D . D))

Когда я пытаюсь связать этот вывод с переменной v, ему присваивается NIL:

(setq v (nqthm-eval `(myghs 1 NIL ,g1))) ==> '(T (B . E) (D . D))
NIL

И проверка равенства впоследствии действительно дает:

(equal v NIL) ==> T

Кажется,мне, что вызов функции nqthm-eval это вывод списка и возвращение NIL, хотя я пока недостаточно понимаю LISP для этого.

Мой вопрос: Есть ли способ получить часть списка вывода / возврата моей функции, например (car (nqthm-eval ...)) или (get_output (nqthm-eval ...)), из "извне"?

1 Ответ

3 голосов
/ 24 сентября 2019

Существует разница между возвращаемым значением функции и выходным .

Возвращаемым значением является просто значение (или значения) последней формы и захватывается setq и др.

Выход отправляется в поток и может быть захвачен только из него.

Например,

(defun foo1 (x)
  (princ (1+ x))
  (1- x))
(foo1 12)

напечатает 13 и вернет 11.

Если вы хотите захватить оба, вам нужно

(defun foo2 (x)
  (values (1+ x) (1- x)))
(setf (values a b) (foo2 17))

и теперь a18 и b - это 16.

PS .На самом деле, если у вас нет контроля над исходным кодом функции и вы все еще хотите захватить его вывод, вы можете сделать это , если вы знаете , где отправляет свой вывод.Например:

(setq b (with-output-to-string (*standard-output*)
          (setq a (foo1 1))))

сейчас b равно "2" (string!), А a равно 0 (number!)

...