我试图在CL中实现一个基本的嵌套循环,但Loop宏正在抵制这个.基本上,我想找到所有可能的3位数字产品,并将它们累积到一个列表中.
这是我的尝试:
(loop for x downfrom 999 to 998 do (loop for y downfrom 999 to 998 collect (* x y)))
Run Code Online (Sandbox Code Playgroud)
上面的代码NIL由于某种原因返回.顺便说一句,我意识到我只跑到998,但这是为了测试目的.
我该怎么做才能获得这样的列表:
(999*999 999*998 ... 998*998 998*997 ... 997*997 997*996 ... 100*100)
它们在Common Lisp包的上下文中有什么区别?我正在阅读SLIME文档,一些命令广泛提及.
我正在编写一个(SBCL)Common Lisp程序,该程序在文件顶部具有以下行:
(defpackage :my-package
(:use :cl :cl-who :hunchentoot :parenscript))
Run Code Online (Sandbox Code Playgroud)
我在MacOS上运行Emacs 25,SBCL和SLIME。
每当我评估上面的行时,总会首先收到此错误:
名称“ CL-WHO”不指定任何软件包。[SB-KERNEL类型的条件:SIMPLE-PACKAGE-ERROR]
然后,我运行(ql:quickload "cl-who")并观看CL-WHO软件包的安装。对于其他两个包,我重复一遍。一旦完成此操作,就可以成功评估表单。
问题是,每次我重新启动Emacs(或Lisp进程,在这种情况下我都认为大致相同)时,都需要这样做。为什么当我使用Quicklisp安装某些东西时,下一个会话没有“记住”它?难道我做错了什么?
这是配置问题还是对它应该如何工作的普遍误解?
我目前正在阅读Paul Graham的"On Lisp"一书中关于读时宏的章节.
我遇到的问题如下.当我运行他的一个例子时:
(set-dispatch-macro-character #\# #\?
#’(lambda (stream char1 char2)
‘#’(lambda (&rest ,(gensym))
,(read stream t nil t))))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
No dispatch function defined for #\’
Run Code Online (Sandbox Code Playgroud)
为什么会这样?可能是因为我在REPL上运行它吗?有什么可以解决它?
我想知道在 Common Lisp 中做这样的事情最有效(算法)和可读的方式是什么:
(setq result-list (append result-list small-list))
Run Code Online (Sandbox Code Playgroud)
也就是说,是否有类似的东西(append-destructively result-list small-list)可以确保result-list包含连接列表?
我这样做是为了提高可读性,但是在(功能性)编程实践方面,这是一个好主意吗?
functional-programming list concatenation append common-lisp
我想知道如何实现以下目标。假设我有一个受let上述约束的变量列表。我想将此列表转换为这些变量绑定到的值的列表。
也就是说,假设我们有
(define make-plist-from-variables (variables)
(let ((keys variables)
(values (mapcar #'identity variables)))
(if (eq (length keys) (length values))
(make-plist keys values)
nil))))
Run Code Online (Sandbox Code Playgroud)
我可以用什么来#'identity正确解压这些值?
目前,以下调用将产生以下输出。
CL-USER> (let ((a 2) (b 3)) (make-plist-from-variables '(a b)))
(A A B B)
Run Code Online (Sandbox Code Playgroud)
我希望成为 (A 2 B 3)
我从Python世界来到Lisp,它基本上运行virtualenv并pip作为创建容器和管理依赖项的方式.
目前,我正在更详细地学习Common Lisp,并想知道它的社区理念是如何管理依赖关系和包.
例如,如果我运行:
(ql:quickload '(cl-who hunchentoot parenscript elephant fiveam css-lite cl-json))
据我所知,所有这些软件包都将安装在quicklisp目录中的某个位置.(我不确定它们的安装形式或位置).
问题是,是否有必要安装不同版本的软件包,具体取决于手头的代码.也就是说,那个人做了什么?他只是依靠包的向后兼容性吗?
Common Lisp世界如何处理这个问题?
我试图弄清楚像 SLIME 或 SLY 这样的软件如何在 Inspector 中显示变量时获取变量的内存地址。我可以使用什么 Common Lisp 函数来以编程方式执行此操作?
例子:
这是#x100cab066d1这里感兴趣的。
我想知道用于销毁defstructCommon Lisp中通过创建的结构的选项是什么。似乎自动提供了一个构造函数。但是,析构函数并非如此。
可以从内存中“清除”结构的方法有哪些?(setq my-struct NIL)我会想到类似的事情,但是我不确定这是否是最干净的方法?
编辑:
当我尝试测试如果我使用结构作为键将某个东西键入哈希表,然后销毁该结构时,会出现问题。哈希表中的键会发生什么?我想这更多是关于如何实现哈希表的问题。
我想知道在Common Lisp中是否有内置的方法可以对值列表类型进行防御性复制。据我了解,该列表不是常规列表,而是某种保留类型。
我想一种解决方案是将其转换为适当的列表,对其进行复制,然后将其转换回值列表。但是,我不确定最有效的方法。
任何帮助表示赞赏。
common-lisp ×10
lisp ×5
sbcl ×3
quicklisp ×2
allegro-cl ×1
append ×1
list ×1
loops ×1
macros ×1
nested ×1
package ×1
python ×1
reader-macro ×1
syntax ×1