Recursion 方案缺省值函数

Recursion 方案缺省值函数,recursion,lisp,scheme,default,tail,Recursion,Lisp,Scheme,Default,Tail,我已经为我在计划中的一个想法挣扎了几天。我经常以 (define fib_h (lambda (n a b) <body ...>)) (define fib (lambda (n) (fib_h n 0 1))) (定义fib_h(λ(n a b))) (定义fib(λ(n)(fib_h n 0 1))) 我认为这将是一个很好的方式来介绍自己进入宏。不幸的是,我似乎对如何解决这个问题有点不知所措。我想我在某一点上接近了 (define-syntax dvf (syntax-

我已经为我在计划中的一个想法挣扎了几天。我经常以

(define fib_h (lambda (n a b) <body ...>))
(define fib (lambda (n) (fib_h n 0 1)))
(定义fib_h(λ(n a b)))
(定义fib(λ(n)(fib_h n 0 1)))
我认为这将是一个很好的方式来介绍自己进入宏。不幸的是,我似乎对如何解决这个问题有点不知所措。我想我在某一点上接近了

(define-syntax dvf
  (syntax-rules ()
    ((_ f (args ...) (name value) ... body)
      <stuff that didn't work>)))
(定义语法dvf
(语法规则()
(uf(args…(名称值)…正文)

我可能没有抓住要点,但这不正是默认参数中的Scheme build工作原理吗:

(define f1
  (lambda (n (a 0) (b 1))
    (printf "n:~a  b:~a  b:~a\n" n a b)))

(f1 10)
(f1 10 0 1)
(f1 10 8 3)
屈服

n:10  b:0  b:1
n:10  b:0  b:1
n:10  b:8  b:3

您可能正在寻找
case lambda
语法,如中所述。下面是其中给出的实现:

(define-syntax case-lambda
  (syntax-rules ()
    ((case-lambda)
     (lambda args
       (error "CASE-LAMBDA without any clauses.")))
    ((case-lambda 
      (?a1 ?e1 ...) 
      ?clause1 ...)
     (lambda args
       (let ((l (length args)))
         (case-lambda "CLAUSE" args l 
           (?a1 ?e1 ...)
           ?clause1 ...))))
    ((case-lambda "CLAUSE" ?args ?l 
      ((?a1 ...) ?e1 ...) 
      ?clause1 ...)
     (if (= ?l (length '(?a1 ...)))
         (apply (lambda (?a1 ...) ?e1 ...) ?args)
         (case-lambda "CLAUSE" ?args ?l 
           ?clause1 ...)))
    ((case-lambda "CLAUSE" ?args ?l
      ((?a1 . ?ar) ?e1 ...) 
      ?clause1 ...)
     (case-lambda "IMPROPER" ?args ?l 1 (?a1 . ?ar) (?ar ?e1 ...) 
       ?clause1 ...))
    ((case-lambda "CLAUSE" ?args ?l 
      (?a1 ?e1 ...)
      ?clause1 ...)
     (let ((?a1 ?args))
       ?e1 ...))
    ((case-lambda "CLAUSE" ?args ?l)
     (error "Wrong number of arguments to CASE-LAMBDA."))
    ((case-lambda "IMPROPER" ?args ?l ?k ?al ((?a1 . ?ar) ?e1 ...)
      ?clause1 ...)
     (case-lambda "IMPROPER" ?args ?l (+ ?k 1) ?al (?ar ?e1 ...) 
      ?clause1 ...))
    ((case-lambda "IMPROPER" ?args ?l ?k ?al (?ar ?e1 ...) 
      ?clause1 ...)
     (if (>= ?l ?k)
         (apply (lambda ?al ?e1 ...) ?args)
         (case-lambda "CLAUSE" ?args ?l 
           ?clause1 ...)))))

标准Scheme没有任何内置默认参数的语法。Scheme中没有默认值,使用默认语法。很抱歉,按照RnRS,您是对的。但我实际上从未使用过缺少默认值的Scheme实现。正如一句小小的补充说明:
case lambda
旨在在内部实现标准化。