究竟是什么定义了"Lisp形式"?
据我所知,它是"一个原子或一个符号作为其第一个元素的列表".
但是,这(在Scheme中)不会是一种形式:
((lambda () 42)) ;; The answer to Life, the Universe and Everything.
Run Code Online (Sandbox Code Playgroud)
因为列表的第一个元素本身就是另一个列表.在评估之后,它将是一个程序(而不是符号).
我可以找到几个不同的网站和教程,讨论Lisp表单,但没有一个提供完整和详细的定义.我在哪里可以找到一个?
我试图理解为什么Prolog实现不会根据教科书中的执行模型来表现 - 例如,Sterling和Shapiro的书中的"Prolog的艺术"(第6章,"纯粹的Prolog",第6.1节, "Prolog的执行模式").
我引用的执行模型是这个(Sterling和Shapiro的第93页):
输入:目标G和程序P.
输出: G的一个实例,它是P的逻辑结果,否则不是
算法:
Initialize resolvent to the goal G
while resolvent not empty:
choose goal A from resolvent
choose renamed clause A' <- B_1, ..., B_n from P
such that A, A' unify with mgu ?
(if no such goal and clause exist, exit the "while" loop)
replace A by B_1, ..., B_n in resolvent
apply ? to resolvent and to G
If resolvent empty, then output G, else output NO
Run Code Online (Sandbox Code Playgroud)
此外(同一本书的第120页),Prolog choose …
我有一个计划宏和一个长列表,我想在列表中映射宏,就像它是一个函数一样。我怎样才能使用 R5RS 做到这一点?
该宏接受几个参数:
(mac a b c d)
Run Code Online (Sandbox Code Playgroud)
名单有
(define my-list ((a1 b1 c1 d1)
(a2 b2 c2 d2)
...
(an bn cn dn)))
Run Code Online (Sandbox Code Playgroud)
我想要这个:
(begin
(mac a1 b1 c1 d2)
(mac a2 b2 c2 d2)
...
(mac an bn cn dn))
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,正如你所看到的,我也想拼接参数列表)
我知道这syntax-rules是一个卫生的宏观系统,但我不明白为什么会发生这种情况:
(define not (lambda (x) x))
(define-syntax nand
(syntax-rules ()
((_ a b)
(not (and a b)))))
(nand #f #t)
==> #f
Run Code Online (Sandbox Code Playgroud)
现在,如果我not 在定义宏后重新定义,则(nand #f #t)返回#t. 为什么,如果宏观系统应该是卫生的?
我在理解以下Scheme程序的行为时遇到了一些麻烦:
(define c
(dynamic-wind
(lambda () (display 'IN)(newline))
(lambda () (call/cc (lambda (k)
(display 'X)(newline)
k)))
(lambda () (display 'OUT)(newline))))
Run Code Online (Sandbox Code Playgroud)
据我所知,c将被绑定到"(display'X)"之前创建的连续符.
但是使用c似乎会改变自己!上面的定义打印(如我所料)IN,X和OUT:
IN
X
OUT
Run Code Online (Sandbox Code Playgroud)
这是一个程序:
#;2> c
#<procedure (a9869 . results1678)>
Run Code Online (Sandbox Code Playgroud)
现在,我希望当它再次被调用时,X会打印出来,而不是!
#;3> (c)
IN
OUT
Run Code Online (Sandbox Code Playgroud)
现在c不再是一个程序了,c的第二次调用将不起作用!
#;4> c ;; the REPL doesn't answer this, so there are no values returned
#;5> (c)
Error: call of non-procedure: #<unspecified>
Call history:
<syntax> (c)
<eval> (c) <--
Run Code Online (Sandbox Code Playgroud)
我期待(c)的每次调用都会做同样的事情 - 打印IN,X和OUT.我错过了什么?
我有几本关于Scheme的书,其中一些提到名为let和letrec,但实际上没有一个会给出一个令人信服的例子(我的意思是,何时以及为什么我会使用一个而不是另一个).是否存在letrec/named let实际上比内部定义或外部辅助过程更好的替代方案?
我想知道一种编程语言,其本身支持定界的延续。我确实知道Scala曾经有shift和reset,但是那些被删除了;而且我也知道Seaside似乎有类似的东西,但是Seaside是一个图书馆,据我了解,Smalltalk不支持定界延续。
那么,是否有支持这种延续的编程语言?
谢谢!