我正在进行一项任务,我必须构建一个函数,它接受一个参数并返回各种事物。但是,如果在没有争论的情况下进行评估,它也应该做一些事情,我不知道如何做到这一点。有谁知道如何实现这样的功能?我是否可以设置一个条件,如果用参数进行评估,它会做x,如果没有参数,它会做y?
答案 0 :(得分:4)
您可以使用表单
(define g (lambda args ...body...))
为此。 args
将绑定到函数调用中所有提供的参数的列表。您可以对其进行分析并在函数...body...
中进行适当的决策。
一个着名且非常好的例子是
(lambda args args)
这个功能的名称是什么?
定义此类函数的另一种语法是
(define (g . args) args)
要定义一个必须得到的函数,比方说,至少有两个参数,你要编写
(define (foo a b . c) ...body...)
; (define foo (lambda (a b . c) ...body...))
其中a
将是第一个参数,b
是第二个参数,c
将是函数调用中所有其余参数的列表(可能为空)。
答案 1 :(得分:1)
方案,如符合R5RS,R6RS和R7RS:
(define (proc . arg-rest)
(define arg
(if (null? arg-rest)
'default-arg1
(car arg-rest)))
;; use arg
arg)
(proc) ; ==> 'default-arg1
(proc 1) ; ==> 1
如果参数不是正确的列表,则虚线符号将其余参数表示为列表。上面的示例没有强制参数。为了完整性,这里有一个强制性的:
(define (proc man1 . arg-rest)
...)
SRFI-89 Optional positional and named parameters是R5RS的扩展。许多实现已经实现了许多SRFI,而那些没有实现的SRFI可以参考实现。有些实现甚至与define
一样,但它不可移植。
(define* (proc (arg 'default-arg1))
;; use arg
arg)
(define* (proc man1 (arg 'default-arg1))
...)
SRFI-16 Case lambda是另一种选择,随附R6RS:
(define proc
(case-lambda
(() (proc 'default-arg1))
((arg)
;; use arg
arg)))
(define proc
(case-lambda
((man1) (proc man1 'default-arg1))
((man1 arg)
...)))
由于你已经标记了LISP,我将添加Common Lisp版本的位置可选参数:
(defun fun (&optional (arg 'default-arg1))
arg)
(defun fun (man1 &optional (arg 'default-arg1))
...)