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
旨在在内部实现标准化。