这个问题可能有一个令人尴尬的简单答案,但是有没有正确的方法在Common Lisp中格式化/绘制树?我已经尝试了几本书以及谷歌搜索,但问题似乎落在搜索术语的裂缝之间.
提前致谢!
DO,PROG等在它们的身体周围建立一个名为nil的隐式块.CLHS不提供执行此操作的所有标准宏的列表.到目前为止我所知道的:
DO
DO*
PROG
PROG*
LOOP
DOLIST
DOTIMES
DO-SYMBOLS
DO-ALL-SYMBOLS
DO-EXTERNAL-SYMBOLS
Run Code Online (Sandbox Code Playgroud)
是否有任何其他标准CL宏或特殊形式建立隐式nil块?
将项目添加到列表末尾的典型方法是什么?
我有一个列表(1 2 3)并想要添加4(其中4是评估结果(+ 2 2))
(setf nlist '(1 2 3))
(append nlist (+ 2 2))
Run Code Online (Sandbox Code Playgroud)
这表示append需要一个列表,而不是一个数字.我怎么做到这一点?
在Common Lisp中,如何覆盖CLOS类的默认字符串表示形式,以便调用format
或princ
打印可理解的内容,即使该类的对象嵌入其他类型(如列表或数组)中也是如此?
例如,如果我(format t "~a~%" x)
在x持有我的解决方案类的实例时调用,我希望它打印出类似的东西#<SOLUTION genes: #(1 2 3) scores: #(4 5) rank: 6>
而不是#<SOLUTION {BB7CD31}>
.
到目前为止,我已经设法弄清楚是编写自定义函数来处理我知道将包含此类实例的打印结构,但这很乏味.当然Lisp提供了一些免费获得此功能的方法吗?
在Common Lisp中为值和函数设置单独的命名空间的设计决策背后的基本原理是什么?支持和反对的论据是什么?
我正在通过格雷厄姆的书"On Lisp"工作,并且无法理解第37页的以下示例:
If we de?ne exclaim so that its return value incorporates a quoted list, (defun exclaim (expression) (append expression ’(oh my))) > (exclaim ’(lions and tigers and bears)) (LIONS AND TIGERS AND BEARS OH MY) > (nconc * ’(goodness)) (LIONS AND TIGERS AND BEARS OH MY GOODNESS) could alter the list within the function: > (exclaim ’(fixnums and bignums and floats)) (FIXNUMS AND BIGNUMS AND FLOATS OH MY GOODNESS) To make exclaim proof against such problems, it should be written: (defun exclaim …
我想更改列表的第n个元素并返回一个新列表.
我想到了三个相当不优雅的解决方案:
(defun set-nth1 (list n value)
(let ((list2 (copy-seq list)))
(setf (elt list2 n) value)
list2))
(defun set-nth2 (list n value)
(concatenate 'list (subseq list 0 n) (list value) (subseq list (1+ n))))
(defun set-nth3 (list n value)
(substitute value nil list
:test #'(lambda (a b) (declare (ignore a b)) t)
:start n
:count 1))
Run Code Online (Sandbox Code Playgroud)
这样做的最佳方式是什么?
我用Vim作为编辑."实用的常见Lisp"建议安装Lispbox,我不知道如何使用emacs,不知道如何使用该TT运行lisp代码之后我找到了vim的lisp插件,称为limp.vim,带有长而硬的安装指令:((最后我安装了"Clisp",我可以使用一个简单的命令运行lisp代码:
clisp ~/test.lisp
Run Code Online (Sandbox Code Playgroud)
但是如何编译呢?lisp是编译语言吗?对不起,我只是什么都不知道,我是lisp的新手
任何人都可以告诉我在linux上安装lisp到底需要什么?什么是SLIME,sbcl,......等等?
考虑具有以下签名的函数:
(defn make-widget [& {:keys [x y] :or {x 10 y 20}}]
...)
Run Code Online (Sandbox Code Playgroud)
将地图传递给函数的最佳方法是什么,例如:
(make-widget {:x 100})
Run Code Online (Sandbox Code Playgroud)
要么
(make-widget {:y 200 :x 0})
Run Code Online (Sandbox Code Playgroud)
目前有什么我想到的是通过vec
,flatten
并apply
如:
(apply make-widget (flatten (vec ({:x 100}))
Run Code Online (Sandbox Code Playgroud)
我坚信有更好的方法可以做到这一点.你能考虑一下吗?
我发现很难推断宏观扩张,并且想知道测试它们的最佳实践是什么.
所以如果我有一个宏,我可以通过执行一个级别的宏扩展macroexpand-1
.
(defmacro incf-twice (n)
`(progn
(incf ,n)
(incf ,n)))
Run Code Online (Sandbox Code Playgroud)
例如
(macroexpand-1 '(incf-twice n))
Run Code Online (Sandbox Code Playgroud)
评估为
(PROGN (INCF N) (INCF N))
Run Code Online (Sandbox Code Playgroud)
将它变成对宏的测试似乎很简单.
(equalp (macroexpand-1 '(incf-twice n))
'(progn (incf n) (incf n)))
Run Code Online (Sandbox Code Playgroud)
是否有用于组织宏测试的既定惯例?还有,是否有一个库来总结s表达式之间的差异?
common-lisp ×9
lisp ×8
append ×1
block ×1
clojure ×1
clos ×1
destruction ×1
linux ×1
list ×1
literals ×1
macros ×1
map ×1
namespaces ×1
on-lisp ×1
quoting ×1
scheme ×1
string ×1
tree ×1
unit-testing ×1