【问题标题】:Scheme Lists of Functions - How to access a function in the list?Scheme Lists of Functions - 如何访问列表中的函数?
【发布时间】:2014-06-10 19:46:42
【问题描述】:

在scheme中,如何访问列表中的某个函数并将变量传递给该函数?

(define f 
        '((lambda (n) (+ n 2)) 
          (lambda (n) (* n 2)) 
          (lambda (n) (* n n))))

我已经定义了这个列表 f,其中有 3 个不同的函数,我想知道我可以在 scheme 中输入什么来将 3 传递给列表中的第二个函数?

我认为像 ((cadr f) 3) 这样的东西会起作用,但我似乎无法弄清楚,任何帮助将不胜感激我真的是 Scheme 的新手。

【问题讨论】:

    标签: scheme


    【解决方案1】:

    您在这里拥有的不是函数列表,而是符号列表。还包含一些符号...既然你引用了所有内容,那么所有内容都被引用了,只有数字和列表,字符串是自引用的。如果您想将对象保留在列表中,您有两种选择:

    创建一个列表而不是引用它。

    (define f 
            (list (lambda (n) (+ n 2)) 
                  (lambda (n) (* n 2)) 
                  (lambda (n) (* n n))))
    

    伪引用它并取消引用每个函数声明

    (define f 
            `(,(lambda (n) (+ n 2)) 
              ,(lambda (n) (* n 2)) 
              ,(lambda (n) (* n n))))
    

    说实话,显式列表似乎比伪引用版本好一点。

    你引用的版本给你的是这样的:

    (define f 
            (list (list 'lambda (list 'n) (list '+ 'n 2)) 
                  (list 'lambda (list 'n) (list '* 'n 2)) 
                  (list 'lambda (list 'n) (list '* 'n 'n))))
    

    报价不是材料清单的简写。这是不评估任何东西的简写。

    【讨论】:

    • 我以为 (lambda (arg) (expr)) 是匿名函数定义的格式?
    • 是的,但是既然你引用了它,你最终会得到一个符号列表。像这样:(list 'lambda (list 'arg) (list 'expr))
    • @KaileeKerr Scheme 从左到右进行评估,当它看到引用时,它不会评估任何内容。报价不是材料清单的简写。这是不评估任何东西的简写。
    • 好的,我现在知道了!非常感谢!我现在能够使用您展示的第一种方法来评估使用 > ((cadr f) 3) 创建列表
    • @LoïcFaure-Lacroix “报价不是速记...”位是一个很好的描述。也许您应该将其添加到答案中,以便所有人都能看到。我认为引用对于初学者来说是一个常见的绊脚石(我知道它是给我的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 2022-12-02
    • 2015-01-08
    相关资源
    最近更新 更多