小编jos*_*osh的帖子

"lisp形式"的定义?

究竟是什么定义了"Lisp形式"?

据我所知,它是"一个原子或一个符号作为其第一个元素的列表".

但是,这(在Scheme中)不会是一种形式:

((lambda () 42))  ;; The answer to Life, the Universe and Everything.
Run Code Online (Sandbox Code Playgroud)

因为列表的第一个元素本身就是另一个列表.在评估之后,它将是一个程序(而不是符号).

我可以找到几个不同的网站和教程,讨论Lisp表单,但没有一个提供完整和详细的定义.我在哪里可以找到一个?

lisp scheme

27
推荐指数
2
解决办法
5342
查看次数

Prolog中有哪些数据类型?

根据维基百科,Prolog中的单一数据类型是术语.文还提到,"序言的单个数据taype是术语",但随后继续解释"序言中的数据类型的分类"(但我认为,只有一个类型......)现在,这些幻灯片何况不同的数据类型:"数字,字符和字符串".

那么,Prolog中的数据类型究竟是什么?

types prolog

13
推荐指数
3
解决办法
8788
查看次数

Prolog中的双重否定和执行模型

我试图理解为什么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 …

prolog

6
推荐指数
3
解决办法
858
查看次数

如何在方案中的列表中映射宏?

我有一个计划宏和一个长列表,我想在列表中映射宏,就像它是一个函数一样。我怎样才能使用 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)

(顺便说一句,正如你所看到的,我也想拼接参数列表)

macros scheme

5
推荐指数
1
解决办法
859
查看次数

语法规则不完全卫生?

我知道这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. 为什么,如果宏观系统应该是卫生的?

macros scheme syntax-rules

5
推荐指数
1
解决办法
144
查看次数

帮助动态风和呼叫/ cc

我在理解以下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 continuations racket

4
推荐指数
1
解决办法
1092
查看次数

letrec的常见用法,名为let和internal定义?

我有几本关于Scheme的书,其中一些提到名为let和letrec,但实际上没有一个会给出一个令人信服的例子(我的意思是,何时以及为什么我会使用一个而不是另一个).是否存在letrec/named let实际上比内部定义或外部辅助过程更好的替代方案?

scheme

4
推荐指数
1
解决办法
2020
查看次数

是否有一种编程语言本身支持定界延续?

我想知道一种编程语言,其本身支持定界的延续。我确实知道Scala曾经有shiftreset,但是那些被删除了;而且我也知道Seaside似乎有类似的东西,但是Seaside是一个图书馆,据我了解,Smalltalk不支持定界延续。

那么,是否有支持这种延续的编程语言?

谢谢!

continuations delimited-continuations

2
推荐指数
2
解决办法
149
查看次数