lisp(scheme)函数,可以使用和不使用参数

时间:2018-02-18 19:49:59

标签: scheme lisp

我正在进行一项任务,我必须构建一个函数,它接受一个参数并返回各种事物。但是,如果在没有争论的情况下进行评估,它也应该做一些事情,我不知道如何做到这一点。有谁知道如何实现这样的功能?我是否可以设置一个条件,如果用参数进行评估,它会做x,如果没有参数,它会做y?

2 个答案:

答案 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))
  ...)