我有一个七个整数的列表,最初都是0,我们称之为"数据".在运行程序的过程中,我想定期将其中一个整数的值递增一.在程序结束时我打印数据.一切都很好,除了在程序的每次连续运行中,上次运行的所有数据值都被添加到此运行的所有数据值中.我只想要来自此次运行的数据值.无论数据是类的方法中的局部变量,类的方法调用的单独函数中的局部变量,还是类的槽,都会发生这种意外行为.无论我是通过incf还是(setf value(1+ value))递增数据的各个值,都会发生这种情况.当我重新加载程序时,数据重置为全零,但是当我再次运行程序时,数据会再次添加所有的最后一次运行' s数据到此运行的数据.当我增加其中一个数据值时,我使用函数nth,其中index是另一个对象槽的值.什么可能导致我的"数据"列表的值不受欢迎的持久性?
我想重复一下类的插槽名称列表,两个类的插槽名称相同((current-trial *exp*)并(previous *exp*)引用同一个类的实例).在每次递归时,我想评估插槽名称,以便可以获取和设置该实例的该插槽的值.下面的代码满足了这个期望,但我担心依赖于eval,因为它很慢并且不允许词汇上下文(Graham,1996).那些有效且允许词汇背景的替代配方会是什么?
(dolist (a '(letter number font color height))
(eval
`(when (eq (,a (current-trial *exp*))
(,a (previous *exp*)))
(setf (,a (current-trial *exp*))
(random-not-item
(,a (current-trial *exp*))
(,a *exp*))))))
Run Code Online (Sandbox Code Playgroud) 什么是将数字转换为字符串的好 Common Lisp 函数?
我希望将数字转换为字符串,例如:42 -> "42"
最终,我想将一个字符串和一组数字连接成一组符号,例如:
(loop for i upto 3
collect (concatenate 'string "foo" (some-conversion-function i)) into stngs
finally (return (mapcar #'read-from-strings stngs)))
Run Code Online (Sandbox Code Playgroud)
-> foo0 foo1 foo2 foo3
所有数字都是整数。
我已经使用 (read-from-string (concatenate 'string ...)) 完成了所有工作,只是我缺少一个将数字转换为字符串或其他将连接为字符串的序列的函数。
或者,当然,如果我可以完全跳过字符串并将一个符号和一个数字连接成一个符号,那就太好了,例如: foo 0 -> foo0 ...如果有人可以命名一个连接符号的 Common Lisp 函数直接地。
在Common 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))
Run Code Online (Sandbox Code Playgroud)
但是,该代码导致可疑输出
#<Anonymous Function #x3020018F950F>
Run Code Online (Sandbox Code Playgroud)
当我尝试将其读回时会导致错误:
> 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).
Run Code Online (Sandbox Code Playgroud) 我有一个CLOS对象的插槽名称列表:
(DEFCLASS TRIAL-DATA (STANDARD-OBJECT)
((A-DATUM :ACCESSOR A-DATUM :INITARG :A-DATUM :INITFORM NIL)
(BOTH-DATA :ACCESSOR BOTH-DATA :INITARG :BOTH-DATA :INITFORM 0)
(CUMULATIVE-DATA :ACCESSOR CUMULATIVE-DATA :INITARG :CUMULATIVE-DATA :INITFORM NIL)
(NAME :ACCESSOR NAME :INITARG :NAME :INITFORM VALUE)))
(let* ((td (make-instance 'trial-data))
(slot-lst (mapcar #'slot-definition-name (class-slots (class-of td)))))
Run Code Online (Sandbox Code Playgroud)
我可以读取这些插槽的值:
(let* ((td (make-instance 'trial-data))
(slot-lst (mapcar #'slot-definition-name (class-slots (class-of td)))))
(funcall (symbol-function (nth 0 slot-lst)) td))
Run Code Online (Sandbox Code Playgroud)
==>无
但为什么我不能为这些插槽写新值?我的类试验数据定义是否应该为每个插槽创建一个访问器功能?
;; Should set the first slot, a-datum's, value to 42
(let* ((td (make-instance 'trial-data))
(slot-lst (mapcar #'slot-definition-name (class-slots (class-of …Run Code Online (Sandbox Code Playgroud) lisp ×5
common-lisp ×4
clos ×2
accessor ×1
literals ×1
numbers ×1
s-expression ×1
scheme ×1
slot ×1
string ×1