我已经为我在计划中的一个想法而苦苦挣扎了几天。我经常以
(define fib_h (lambda (n a b) <body ...>))
(define fib (lambda (n) (fib_h n 0 1)))
我认为这是向宏介绍自己的好方法。不幸的是,对于如何宏化这一点,似乎有点超出我的能力。我想我一度接近
(define-syntax dvf
(syntax-rules ()
((_ f (args ...) (name value) ... body)
<stuff that didn't work>)))
这将定义一个函数"f",该函数要么采用"args ..."或"args ...名字..."然后,如果只需要"args ..." 它应用"值..."到"名称..."参数。我可以想到两个好方法。第一个需要Y组合器,我真的不想使用它们。另一种方式需要我以某种方式获取"名称"中的变量数......"和"哗啦啦..."如果有人能帮我解决这个问题,我将不胜感激。
您可能正在寻找 SRFI-16 中描述的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 内置默认参数的工作原理:
(define f1
(lambda (n (a 0) (b 1))
(printf "n:~a b:~a b:~an" 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