我试图了解Lisp的部分内容,到目前为止我还没有用过很多东西.读宏已经引起了我的注意.没有一个巨大的关于他们的信息的量使用,它会帮看看什么人跟他们做,既能得到它们是如何工作的例子,也看什么类型的问题可以与他们接近.接下来,是否有任何指导方针可以了解读取宏的优缺点是什么?
我最近一直在使用Clojure,但我仍然不明白我没有得到那些常见的lisp阅读器宏提供的功能.可以用简单的术语解释一下这个吗?
有人知道什么#+
和#-
运营商意味着.sbclrc
什么?我在手册中找不到它.我#-
在.sbclrc
安装quicklisp之后看到了:
#-quicklisp
(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
(user-homedir-pathname))))
(when (probe-file quicklisp-init)
(load quicklisp-init)))
Run Code Online (Sandbox Code Playgroud)
我也在#+
SBCL用户手册中看到,但我找不到其功能的解释.看起来像是加载单个模块相关的东西.
它们仅用于SBCL实施还是Common lisp的一部分?
在将lisp代码文件编译成字节码或原始程序集(或者就此而言的fasl文件)时,我在理解读取宏的内容时遇到了一些麻烦.或许我确实理解但却不知道.我真的很困惑.
当您使用读取宏时,您是否必须拥有可用的源?
如果这样做,那么您必须执行构成读取宏功能的源代码.如果你不这样做,那么当你可以做的事情时,他们怎么能工作read-char
?
要做到这一点,如果你想让read宏使用上面提到的变量,你必须在它之前执行所有代码,这样就变成了运行时,它会弄乱一切.
如果您之前没有运行代码,那么上面定义的内容将无法使用.
那些定义读取宏的函数或编译器宏呢?除非你require
或者load
文件或者没有编译的东西,否则我会认为它们根本不起作用.但如果他们被编译,那么他们将无法使用它们?
如果我的一些猜测是正确的,那么这意味着"可用于宏的数据"和"函数可用的宏"存在很大差异,具体取决于您是要编译整个文件以便稍后运行还是一次解释一行文件(即,读取,编译和评估一个接一个的表达式).
简而言之,似乎要将一行编译成一个可以在没有进一步宏处理的情况下执行的表单,或者你需要读取,编译和运行前面的行.
再次记住,这些问题适用于编译lisp,而不是将其解释为可以在每行运行时将其解释.
对不起我的漫无目的,但我是lisp的新手,想知道它是如何工作的.
lisp compiler-construction interpreter common-lisp reader-macro
我刚刚阅读了尖锐的冒号读取器宏,听起来它与gensym的效果非常相似
Sharpsign Colon:"介绍一个没有内嵌的符号"
Gensym:"创造并回归一个新鲜的,没有内容的符号"
所以一个简单的测试
CL-USER> #:dave
; Evaluation aborted on #<UNBOUND-VARIABLE DAVE {1002FF77D3}>.
CL-USER> (defparameter #:dave 1)
#:DAVE
CL-USER> #:dave
; Evaluation aborted on #<UNBOUND-VARIABLE DAVE {100324B493}>.
Run Code Online (Sandbox Code Playgroud)
冷却,以便它应该失败.
现在进行宏观测试
(defmacro test (x)
(let ((blah '#:jim))
`(let ((,blah ,x))
(print ,blah))))
CL-USER> (test 10)
10
10
CL-USER>
Run Code Online (Sandbox Code Playgroud)
甜,所以它可以像gensym一样使用.
对我而言,这看起来比gensym更清晰,结果明显相同.我确定我错过了一个至关重要的细节所以我的问题是,它是什么?
我喜欢常见的口齿不清,但有时输入简单的数学表达式是非常痛苦的
a(8b^2+1)+4bc(4b^2+1)
Run Code Online (Sandbox Code Playgroud)
(当然我可以转换它,但它有点慢,我先写(+()()),然后在每个括号中我放(*()())...)
我想知道这里是否有人知道更好的输入方法.我正在考虑编写一个数学宏,在哪里
(math “a(8b^2+1)+4bc(4b^2+1)”)
Run Code Online (Sandbox Code Playgroud)
扩展到
(+ (* a (1+ (* 8 b b))) (* 4 b c (1+ (* 4 b b))))
Run Code Online (Sandbox Code Playgroud)
但解析是名称很长的变量的问题.
有人有更好的建议吗?
为什么以下不起作用?
;;;; foo.lisp
(in-package :cl-user)
(eval-when (:compile-toplevel :load-toplevel :execute)
(require :cl-interpol))
(cl-interpol:enable-interpol-syntax)
(defun read-and-eval (s)
(eval (read-from-string s)))
(cl-interpol:disable-interpol-syntax)
Run Code Online (Sandbox Code Playgroud)
然后:
LISP> (load (compile-file "foo.lisp"))
=> T
LISP> (read-and-eval
"(let ((a \"foo\")) (princ #?\"${a}\"))")
=> no dispatch function defined for #\?
Run Code Online (Sandbox Code Playgroud) 据我了解,Clojure 不会公开阅读器宏表或允许用户定义阅读器宏。
The read table is currently not accessible to user programs.
Run Code Online (Sandbox Code Playgroud)
我只是想知道是否有明确或明确的声明(大概来自 Rich Hickey)说明将它们排除在 Clojure 之外的理由。
注意我不是问 Clojure 缺少用户定义的阅读器宏是好事还是坏事。只是想知道为什么。
Common Lisp中有一些读取宏'
#'
#P
,但是如何编写读取宏呢?
像这样:
#T"hello world"
====================>
(gettext "hello world")
Run Code Online (Sandbox Code Playgroud) 今晚我在读cl-fad/load.lisp代码,发现表达式或字符串前面有符号#+:
和。#-:
这些符号的含义是什么?
reader-macro ×10
common-lisp ×8
lisp ×6
clojure ×2
s-expression ×2
interpreter ×1
prefix ×1
sbcl ×1