【问题标题】:Storing Procedure in a Pair (Scheme/Guile)成对存储过程(Scheme/Guile)
【发布时间】:2016-07-13 00:55:41
【问题描述】:

我在 Guile 工作,需要使用成对存储的过程。如果我在以下示例中存储car

(define pairA (cons 1 car))
(define pairB '(1 . car))

.. 我只能从第一个表达式计算过程。第二个变成了一个符号,我猜是因为它是一对而不是一个列表:

>(display pairA)
(1 . #<primitive-procedure car>)

>(display pairB)
(1 . car)

为什么第一个示例返回car 作为过程,而不是第二个?我能说的唯一区别是pairA 既是一个列表/对,而pairB 只是一对。有什么方法可以使用(cdr pairB) 作为程序吗?

【问题讨论】:

    标签: functional-programming scheme guile


    【解决方案1】:

    你想要的是

    `(1 . ,car)
    

    这是 quasiquote 构造——简而言之,它只计算 car(通常——只计算未引用的 "," 表达式),并将其值插入到未引用形式的位置。再举一个小例子:

    scheme@(guile-user)> `(quasiquote magic (+ 2 3) => ,(+ 2 3))
    $1 = (quasiquote magic (+ 2 3) => 5)
    

    您的第一个示例有效,因为 cons 是一个过程(即不是特殊形式),因此它的参数在应用之前被评估。第二个不起作用,因为您引用了 (1 . car)。

    另请注意,您的 pairA 不是列表——过程不表示为列表,它们是原子:

    scheme@(guile-user)> (pair? car)
    $1 = #f
    

    【讨论】:

    • 感谢您的解释!我以前在文档中找不到任何关于以这种方式使用表达式的内容,但现在看看它是如何工作的。如果我无法更改列表的构建方式,是否可以将'(1 . car) 视为准/未引用?我正在使用一个具有特定列表构建基础结构的程序,它基本上接受用户输入并制作一堆列表,而不考虑值是否是程序、符号、数字等。
    • @JefferyShivers 用户输入实际上不能指定函数。除非您希望用户输入中的 car 实际映射到 car 过程:在这种情况下,您可能需要一个符号到过程的哈希表(或 alist,如果很小)。 alist 看起来像这样:`((car . ,car) (cdr . ,cdr) ...)。 (这有点难以在评论框中详细解释,但我很乐意尝试解释您提出的任何问题。)
    • 感谢@Chris,这很有道理!像您展示的那样编写 alist 非常有效。
    猜你喜欢
    • 2019-02-28
    • 2016-10-23
    • 2016-01-17
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 2018-12-19
    • 2019-07-01
    • 1970-01-01
    相关资源
    最近更新 更多