这个问题是关于sbcl - 或者我最初想的.问题:角色什么时候不是角色?请考虑以下代码:
(defconstant +asc-lf+ #\Newline)
(defconstant +asc-space+ #\Space)
(prin1 (type-of #\Newline )) (terpri)
(prin1 (type-of #\Space )) (terpri)
(prin1 (type-of +asc-lf+ )) (terpri)
(prin1 (type-of +asc-space+)) (terpri)
Run Code Online (Sandbox Code Playgroud)
正如所料,它产生:
STANDARD-CHAR
STANDARD-CHAR
STANDARD-CHAR
STANDARD-CHAR
Run Code Online (Sandbox Code Playgroud)
现在考虑这段代码:
(defun st (the-string)
(string-trim '(#\Newline #\Space) the-string))
(princ "\"")
(princ (st " abcdefgh "))
(princ "\"")
(terpri)
Run Code Online (Sandbox Code Playgroud)
它产生:
"abcdefgh"
Run Code Online (Sandbox Code Playgroud)
但请考虑以下代码:
(defconstant +asc-lf+ #\Newline)
(defconstant +asc-space+ #\Space)
(defun st (the-string)
(string-trim '(+asc-lf+ +asc-space+) the-string))
(princ "\"")
(princ (st " abcdefgh "))
(princ "\"")
(terpri)
Run Code Online (Sandbox Code Playgroud)
当您使用sbcl加载它时,它会为您提供:
While evaluating …Run Code Online (Sandbox Code Playgroud) 我需要在循环条件下执行除"collect"之外的指令,我无法找出工作语法......
例如,我希望以下代码打印i并在2 <i时收集它.
(loop for i '(1 2 3 4) in when (< 2 i) (print i) collect i) ==> (3 4)
Run Code Online (Sandbox Code Playgroud)
希望你能帮忙!
我们怎样才能用方案语言中的字符串获取变量值,因为我们可以在Common Lisp中实现这一点:
> (defvar s 3)
> S
> (symbol-value (intern "S"))
> 3
Run Code Online (Sandbox Code Playgroud)
我从闭包中访问父函数的参数.
编辑:我找到了这个解决方案,但我不能使用eval,因为它在顶层评估.寻找替代品.
(eval (string->symbol "s"))
Run Code Online (Sandbox Code Playgroud)
编辑2:我发现Common lisp代码也试图在全局空间中找到符号.所以这个问题基本上都适用于Lisps(Common Lisp,Scheme).
我正在寻找可以为我生成lisp程序中每个函数的代码行的统计信息的程序.在Lisp中,这意味着每个函数或宏可以计算顶级函数中递归包含的函数数量.
任何指针都将非常感激.
我的任务是查找列表中是否包含给定元素(非线性列表).这就是我现在写的,但是这个函数的返回值是一个列表,我真的不明白为什么.
(setq E 4)
(defun IsMember (L)
(cond
((equal E L)
T
)
((atom L)
NIL
)
(T
(or (mapcar 'IsMember L))
)
)
)
(print (IsMember '(1 2 3 (((4) 5) 6))))
Run Code Online (Sandbox Code Playgroud)
返回值是:(NIL NIL NIL (((T) NIL) NIL))
但它应该真正输出,T或者NIL如果E在给定列表中找不到.
我想在Common Lisp函数中使用一个变量作为计数器,从所需的数字开始并在循环中使用.
(defun x(c)
(setq i 4)
(loop while condition do
;do something
(incf i)))
Run Code Online (Sandbox Code Playgroud)
说明setq,incf并不适合这一点.在clisp中管理计数器变量的标准方法是什么?
Clojure有自己的系列,不需要传统的lispy cons细胞.但我发现这个概念很有意思,它被用在一些教材中(例如,SICP).我一直想知道这个cons原语是否需要是原始的.我们不能在库中实现它(以及在其上运行的传统功能)吗?我搜索过,但是我发现没有写过这样的库.
在完成CLRS Intro to Algorithms一书并试图在常见的lisp中实现红黑二叉搜索树时,我遇到了以下问题:圆形指针:
(defstruct node (ptr nil))
(defparameter *x* (make-node))
(defparameter *y* (make-node :ptr *x*))
(setf (node-ptr *x*) *y*)
Run Code Online (Sandbox Code Playgroud)
此代码导致堆耗尽错误,可能是由于指针指向指向该指针的指针等引起的无限递归.
有没有办法防止这种无限递归发生,同时保持这里给出的指针结构?
我知道还有其他方法可以实现红黑树(例如,不使用setf),但我有兴趣在CLRS中复制命令式样式,因为常见的lisp是一种多范式语言.
PS.除了通常的左子指针和右子指针之外,CLRS中的BST还有父指针.
所以我想重新制作一个程序,该程序使用列表来包含对象并用数组替换列表.
我遇到了一个问题,我的对象属于同一个实例
(setq arr (make-array 3 :initial-element (make-instance 'object) :adjustable t :fill-pointer 3))
在此代码执行之后
数组中的所有对象都是相同的,解释器给了我这个
#(#<OBJECT {1002DFDD23}> #<OBJECT {1002DFDD23}> #<OBJECT {1002DFDD23}>)
我知道其他方法可以做到这一点,但我仍然想知道为什么会这样?
如果不是什么#<OBJECT {1002DFDD23}意思作为一个整体是什么意思,这是一个什么样的内存地址?
有没有办法(使用循环或迭代,无关紧要)向后迭代序列?
除了(loop for i downfrom 10 to 1 by 1 do (print i))使用索引,需要长度,或(loop for elt in (reverse seq))需要反转序列(甚至比第一个选项更糟糕).