【问题标题】:passing known arguments to Scheme function将已知参数传递给 Scheme 函数
【发布时间】:2018-08-10 05:02:41
【问题描述】:

我有一个函数primeFactors,我想接受一个数字,并返回一个数字因子列表。看来

(define (primeFactors x '()) ...FOOBAR)

无效,但是

的解决方法

(define (primeFactors x) (primeFactors2 x '()))

在其他地方定义primeFactors2 会起作用,因为我可以在调用函数但不定义它时将空列表作为参数传递。有没有一种不那么糟糕的方式来传递这种预先确定的参数?

【问题讨论】:

  • 您是否想要一个带有可选参数的函数,如果在调用时将其省略,则该函数使用默认值?如果是这样...您没有提及您正在使用的 which 方案,但是许多流行的方案通过 DSSSL 样式参数列表或其他执行相同操作的语法来支持该方案。
  • 在您的具体情况下,您也可以使用(lambda (x . rest))
  • “不那么糟糕”的方式是委托给本地定义的函数。这样可以避免使用纯内部状态的东西污染接口。

标签: scheme


【解决方案1】:

R7RS-Small 和 R6RS 在库中有case-lambda (scheme case-lambda)(rnrs control 6)

#!r7rs
(import (scheme base)
        (scheme case-lambda))

(define prime-factors
  (case-lambda
    ((n) (prime-factors n '()))
    ((n lst) 'implementation)))

对于 R5RS,我们有 SRFI-89 Positional arguments。也许你最喜欢的实现已经有了它,如果没有,你可以从规范中获取它。以下是它的工作原理:

#!r5rs
(define* (prime-factors x (lst '()))
  'implementation)

一种纯粹兼容的 Scheme 方法:

;;; (prim-factors n [lst '()]) => lst
(define (prime-factors n . llst)
  (define (prime-factors n lst)
     'implementation)
  (prime-factors n (if (null? llst) '() (car llst))))

本地函数只是为了在您进行递归的情况下提高效率,因为它只是没有第二个参数的初始调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    相关资源
    最近更新 更多