首页 > 解决方案 > 将已知参数传递给 Scheme 函数

问题描述

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

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

无效,但是解决方法

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

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

标签: scheme

解决方案


R7RS-Small 和 R6RScase-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))))

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


推荐阅读