函数输出一个列表但是 returns nil

Function outputs a list but returns nil

我调用了一个函数,它输出一个列表,我想在之后使用。我尝试将函数的输出绑定到一个变量,但它没有分配给列表 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 的理解还不够。

我的问题: 有没有办法从我的函数中获取 output/return 的列表部分,例如 (car (nqthm-eval ...))(get_output (nqthm-eval ...)) 'outside'?

函数的return值与其输出之间存在差异。

return 值只是 value (or values) of the last form and is captured by setq

输出被发送到流并且只能从流中捕获。

例如,

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

将打印 13 和 return 11.

如果你想同时捕获两者,你需要

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

现在 a18b16

PS。实际上,如果您无法控制函数源代码并且仍想捕获其输出,您可以这样做 if you know where it发送它的输出。例如:

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

现在 b"2"(一个 string!)而 a0(一个 number!)