标签: lisp

sbcl(和clisp):什么时候字符不是字符?(使用defconstant)

这个问题是关于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)

lisp clisp sbcl common-lisp

0
推荐指数
2
解决办法
262
查看次数

在Common Lisp循环中的条件下收集并执行某些操作

我需要在循环条件下执行除"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)

希望你能帮忙!

lisp loops common-lisp

0
推荐指数
1
解决办法
456
查看次数

使用scheme中的字符串获取变量值

我们怎样才能用方案语言中的字符串获取变量值,因为我们可以在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 scheme common-lisp

0
推荐指数
1
解决办法
343
查看次数

寻找一个可以帮助我为lisp程序生成每个函数统计信息的代码行的程序

我正在寻找可以为我生成lisp程序中每个函数的代码行的统计信息的程序.在Lisp中,这意味着每个函数或宏可以计算顶级函数中递归包含的函数数量.

任何指针都将非常感激.

lisp metrics common-lisp code-metrics loc

0
推荐指数
1
解决办法
79
查看次数

OR,和mapcar的结果 - 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在给定列表中找不到.

lisp common-lisp logical-operators

0
推荐指数
1
解决办法
105
查看次数

在Common Lisp中初始化计数器变量

我想在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中管理计数器变量的标准方法是什么?

lisp common-lisp

0
推荐指数
2
解决办法
203
查看次数

在Clojure中,不能在库级别有效地实现单元格吗?

Clojure有自己的系列,不需要传统的lispy cons细胞.但我发现这个概念很有意思,它被用在一些教材中(例如,SICP).我一直想知道这个cons原语是否需要是原始的.我们不能在库中实现它(以及在其上运行的传统功能)吗?我搜索过,但是我发现没有写过这样的库.

lisp clojure cons data-structures

0
推荐指数
1
解决办法
288
查看次数

lisp中的循环指针

在完成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还有指针.

lisp clisp sbcl common-lisp circular-reference

0
推荐指数
1
解决办法
125
查看次数

Lisp为什么我的对象是同一个实例?

所以我想重新制作一个程序,该程序使用列表来包含对象并用数组替换列表.

我遇到了一个问题,我的对象属于同一个实例

(setq arr (make-array 3 :initial-element (make-instance 'object) :adjustable t :fill-pointer 3))

在此代码执行之后

数组中的所有对象都是相同的,解释器给了我这个

#(#<OBJECT {1002DFDD23}> #<OBJECT {1002DFDD23}> #<OBJECT {1002DFDD23}>)

我知道其他方法可以做到这一点,但我仍然想知道为什么会这样?

如果不是什么#<OBJECT {1002DFDD23}意思作为一个整体是什么意思,这是一个什么样的内存地址?

lisp arrays common-lisp

0
推荐指数
1
解决办法
86
查看次数

Lisp,向后迭代

有没有办法(使用循环或迭代,无关紧要)向后迭代序列?

除了(loop for i downfrom 10 to 1 by 1 do (print i))使用索引,需要长度,或(loop for elt in (reverse seq))需要反转序列(甚至比第一个选项更糟糕).

lisp iteration common-lisp

0
推荐指数
1
解决办法
309
查看次数