Lisp 符号表达式流I/O

Lisp 符号表达式流I/O,lisp,common-lisp,s-expression,Lisp,Common Lisp,S Expression,在公共Lisp中,如何从/到流读取和写入符号表达式?例如,我可能想将一个匿名函数写入文件,然后读取并调用它: ;;; sexp-io.lisp ;;; Try writing a sexp to file and reading it back in (with-open-file (file "~/Documents/Lisp/Concurrency/sexp.lisp" :direction :output :if-exists :supersede)

在公共Lisp中,如何从/到流读取和写入符号表达式?例如,我可能想将一个匿名函数写入文件,然后读取并调用它:

;;; sexp-io.lisp
;;; Try writing a sexp to file and reading it back in

(with-open-file (file "~/Documents/Lisp/Concurrency/sexp.lisp"
                  :direction :output :if-exists :supersede)
  (print #'(lambda () (+ 1 1)) file))

(with-open-file (file "~/Documents/Lisp/Concurrency/sexp.lisp"
                  :direction :input)
  (read file))
但是,该代码会导致可疑的输出

 #<Anonymous Function #x3020018F950F>
#
当我尝试将其读回时,确实会导致错误:

> Error: Reader error on #<BASIC-FILE-CHARACTER-INPUT-STREAM ("/Users/frank/Documents/Lisp/Concurrency/sexp.lisp"/7 UTF-8) #x3020018F559D>, near position 3, within "
>        #<Anonymous ":
>        "#<" encountered.
> While executing: CCL::SIGNAL-READER-ERROR, in process Listener(4).
>错误:位置3附近的#上的读卡器错误,在“
>#你正在做的,除了把
(lambda()(+1))
变成一个对象。只要用一个简单的引号(读作)替换尖锐的引号(读作)就可以了

您可能要做的另一个更改是将其替换为参数
:可读的t

(write my-object :stream out :readably t)
:可读性的好处是,如果无法以保持打印读取一致性的方式写入,则会失败。

您正在这样做,除了将
(lambda()(+1))
转换为对象之外。只需将尖引号(读取为)替换为简单引号(读取为),它就会工作

您可能要做的另一个更改是将其替换为参数
:可读的t

(write my-object :stream out :readably t)

:易读的
的好处是,如果无法以保持打印读取一致性的方式写入,则会失败。

您到底想做什么?您到底想做什么?TRT代表什么?TRT代表什么?