需要使用其他语言的break语句或continue语句的代码可以使用block&return-from和catch/ throw在Common Lisp和Emacs Lisp中完成.然后有代码需要redo声明,或至少最好用redo.和redo语句不必须对循环.我怎么能redo在Lisp中做?
如果redo在Lisp中有一个等价物,我认为它会像这样工作:特殊形式with-redo,它采用符号和形式,并redo采用符号.表格(with-redo 'foo BODY-FORMS...)可以包含(redo 'foo)在其BODY-FORMS中,并将(redo 'foo)控制权转移回BODY-FORMS的开头.
我很困惑逗号逗号如何做它的作用.
逗号逗号的使用示例是在定义Lisp宏时是否使用双引号(双逗号)?
在我看来,这
(let ((parms '(x y)))
``(beg ,,@parms end))
Run Code Online (Sandbox Code Playgroud)
扩展到或等同于
`(beg ,x ,y end)
Run Code Online (Sandbox Code Playgroud)
它是如何扩展到那个?
我在想,如果我评估双反引号形式,它会导致第二个逗号完成它的工作,结果是:
`(beg ,<splice stuff here> end)
Run Code Online (Sandbox Code Playgroud)
看起来像Lisp解释器应该抱怨并说"我不知道在逗号之前将东西拼接起来意味着什么"在Lisp遇到的意义上
`,@abc
Run Code Online (Sandbox Code Playgroud)
它可能会说"我不知道在反引号之前拼接东西意味着什么.不要再这样做了."
但不知何故,翻译不会抱怨而只是选择这样做
`(beg <splice stuff here and write comma in front of each of them> end)
Run Code Online (Sandbox Code Playgroud)
这是否与CLHS反引用中的规则兼容?
对于读者信息,答案后面的评论指的是答案的旧版本,并导致更新答案.新读者不需要阅读评论.
是否存在gensym在前缀中附加唯一数字的功能派上用场的情况?我不明白为什么会有gensym时
(let ((str "batman"))
(eq (make-symbol str)
(make-symbol str)))
Run Code Online (Sandbox Code Playgroud)
总是回来nil.
例如,使用Ch k,我可以向Emacs询问"C-right在此缓冲区中做了什么?".如果我的设置中当前缓冲区是Lisp缓冲区,Emacs将回答paredit-forward-slurp-sexp.从那时起,我可以猜测C-right与paredit-forward-slurp-sexp的绑定来自paredit模式映射,因为命令名称以paredit为前缀,但这是一种启发式方法.我怎么能以编程方式做到这一点,也就是说,我怎么能问"这个缓冲区中C-right的绑定来自哪里?"
正在编写一个函数,在这种情况下检查当前的全局地图,当前的主模式图,paredit-mode-map,paredit-forward-mode-map,paredit-forward-slurp-mode-map,paredit-forward-slurp-sexp-模式映射唯一的方法?
使用这个最小的init文件:
(setq package-load-list '((slime t)))
(setq inferior-lisp-program "clisp")
(package-initialize)
(setq package-enable-at-startup nil)
(require 'slime)
(slime-setup)
(slime)
(find-file "~/t/del.lisp")
Run Code Online (Sandbox Code Playgroud)
除了查找文档之外,一切似乎都有效,例如slime-eval-defun和slime-complete-symbol.Mx slime-describe-symbol RET print RET导致此错误:
CLHS-ROOT: variable *CLHS-ROOT-DEFAULT* has no value
Run Code Online (Sandbox Code Playgroud)
我需要在init文件中添加什么才能使其正常工作?
我也尝试下载hyperspec tar文件并将其解压缩到一个目录,这段代码:
(setq package-load-list '((slime t)))
(setq inferior-lisp-program "clisp"
common-lisp-hyperspec-root "c:/run/HyperSpec/"
common-lisp-hyperspec-symbol-table "c:/run/HyperSpec/Data/Map_Sym.txt")
(package-initialize)
(setq package-enable-at-startup nil)
(require 'slime)
(slime-setup)
(slime)
(find-file "~/t/del.lisp")
Run Code Online (Sandbox Code Playgroud)
这也行不通.我不知道bug是在那个init文件中,还是在我正在使用的SLIME版本中,因为这是我第一次使用SLIME.
版本:
UPDATE
C-c C-d f RET print RET工作良好.这是绑定的slime-describe-function,没有记录,并且未在SLIME菜单中列出.还有slime-documentation-lookup一个必然C-c C-d C-d可以在浏览器中打开变量(不仅仅是函数)的文档,这也是有效的.看起来只有`slime-describe-symbol不起作用.
当一个人定义一个使用宏的宏,或者定义一个定义宏的宏时,它似乎使用,',或取消引用,.我需要使用时是否有过这种情况,,?