相关疑难解决方法(0)

Common Lisp:是删除 - 如果与setf + remove-if相同?

以下代码从1到n生成素数:

(defun prime-list(n)
  (let ((a)(b)(x (floor (sqrt n))))
    (loop for i from (floor n 6) downto 1 do
          (push (1+ (* 6 i)) a)
          (push (1- (* 6 i)) a))
    (loop while (<= (car a) x) do
          (push (car a) b)
          (setf a (remove-if #'(lambda(m)(or (= 0 (mod m (car a))) (> m n))) a)))
    (append '(2 3) (reverse b) a)))
Run Code Online (Sandbox Code Playgroud)

在我看来这部分

(setf a (remove-if #'XXX a)) 
Run Code Online (Sandbox Code Playgroud)

可以替换为

(delete-if #'XXX a)
Run Code Online (Sandbox Code Playgroud)

我希望这会让它变得更快.然而,当我进行更改时,函数现在进入无限循环并且永远不会返回.为什么?

lisp primes common-lisp

3
推荐指数
1
解决办法
1432
查看次数

DELETE具有破坏性 - 但并非总是如此?

我对Common Lisp的破坏性DELETE函数有点困惑.它似乎按预期工作,除非项目是列表中的第一项:

CL-USER> (defvar *test* (list 1 2 3))
*TEST*
CL-USER> (delete 1 *test*)
(2 3)
CL-USER> *test*
(1 2 3)
CL-USER> (delete 2 *test*)
(1 3)
CL-USER> *test*
(1 3)
Run Code Online (Sandbox Code Playgroud)

sbcl common-lisp

3
推荐指数
2
解决办法
675
查看次数

lisp中的破坏性排序

我正在阅读Practical Common Lisp.在第11章中,它说明了有关排序:

通常,在对序列进行排序后,您不会关心序列的未排序版本,因此在排序过程中允许SORTSTABLE-SORT销毁序列是有意义的.但它确实意味着你需要记住写下面的内容:

(setf my-sequence (sort my-sequence #'string<))
Run Code Online (Sandbox Code Playgroud)

我尝试了以下代码:

CL-USER> (defparameter *a* #( 8 4 3 9 5 9 2 3 9 2 9 4 3)) 
*A*            
CL-USER> *a*
#(8 4 3 9 5 9 2 3 9 2 9 4 3)                                     
CL-USER> (sort *a* #'<)
#(2 2 3 3 3 4 4 5 8 9 9 9 9)
CL-USER> *a*
#(2 2 3 3 3 4 4 5 8 9 …
Run Code Online (Sandbox Code Playgroud)

common-lisp practical-common-lisp

3
推荐指数
2
解决办法
536
查看次数

标签 统计

common-lisp ×3

lisp ×1

practical-common-lisp ×1

primes ×1

sbcl ×1