【问题标题】:How do I handle an unspecified number of parameters in Scheme?如何处理 Scheme 中未指定数量的参数?
【发布时间】:2012-09-30 03:33:57
【问题描述】:

例如((fn-stringappend string-append) "a" "b" "c") 我知道如何处理这个(f x y z)。但是如果有未知数量的参数怎么办?有没有办法处理这种问题?

【问题讨论】:

    标签: function scheme variadic-functions variadic


    【解决方案1】:

    在 Scheme 中,您可以使用点符号来声明一个接收可变数量参数的过程(也称为 varargsvariadic function):

    (define (procedure . args)
      ...)
    

    procedureargs 内部将是一个传递零个或多个参数的列表;像这样称呼它:

    (procedure "a" "b" "c")
    

    正如@Arafinwe 所指出的,这是匿名过程的等效符号:

    (lambda args ...)
    

    这样称呼它:

    ((lambda args ...) "a" "b" "c")
    

    请记住,如果您需要将未知大小列表中的参数传递给可变参数函数,您可以这样编写:

    (apply procedure '("a" "b" "c"))
    (apply (lambda args ...) '("a" "b" "c"))
    

    更新:

    关于 cmets 中的代码,这不会按您的意愿工作:

    (define (fp f)
      (lambda (.z)
        (f .z)))
    

    我相信你的意思是这样的:

    (define (fp f)
      (lambda z
        (apply f z)))
    

    加上一点语法糖,上面的过程可以进一步简化为:

    (define ((fp f) . z)
      (apply f z))
    

    但这对于简单的写作来说还有很长的路要走:

    (apply f z)
    

    这是你需要的吗?

    (apply string-append '("a" "b" "c"))
    

    因为无论如何这等同于以下内容:

    (string-append "a" "b" "c")
    

    string-append已经接收零个或多个参数(至少在 Racket 中是这样)

    【讨论】:

      【解决方案2】:

      除了 Óscar López 的回答之外,您还可以像这样创建一个可变参数的匿名函数:

      (lambda args ...)
      

      同样,lambdaargs 内部是传递的参数列表。

      【讨论】:

      • (define (fp f) (lambda (.z) (f .z))) f 包含未知数量的参数。我的代码有什么问题或者我必须像 z 那样做...
      • “点”与参数的名称是分开的。
      猜你喜欢
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 2012-11-13
      • 2019-08-30
      • 1970-01-01
      • 2018-03-24
      • 2014-03-31
      相关资源
      最近更新 更多