Scheme - 可选参数和默认值

时间:2016-04-28 12:16:13

标签: arguments scheme racket optional-parameters

我正在研究Scheme,以及我理解它的方式,程序可以采用任意数量的参数。

我一直试图解决这个问题,但我很难理解这个概念。

例如,假设我想根据用户提供的信息撰写欢迎信息。

如果用户提供名字和姓氏,程序喊叫:

Welcome, <FIRST> <LAST>!
;; <FIRST> = "Julius", <LAST>= "Caesar"
Welcome, Julius Caesar!

否则,程序应引用默认值,指定为:

Welcome, Anonymous Person!

我的代码有以下大纲,但在如何最终确定这个问题上一直在努力。

(define (welcome . args)
  (let (('first <user_first>/"Anonymous")
        ('last <user_last>/"Person"))
    (display (string-append "Welcome, " first " " last "!"))))

使用示例:

(welcome) ;;no arguments
--> Welcome, Anonymous Person!
(welcome 'first "John") ;;one argument
--> Welcome, John Person!
(welcome 'first "John" 'last "Doe") ;;two arguments
--> Welcome, John Doe!

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

在Racket中,他们这样做的方法是使用keyword arguments。在声明参数时,您可以使用关键字参数my #:keyword argument-id定义一个函数:

(define (welcome #:first first-name #:last last-name)
  (display (string-append "Welcome, " first-name " " last-name "!")))

你可以这样打电话:

> (welcome #:first "John" #:last "Doe")
Welcome, John Doe!

但是,你想要的是让它们成为可选的。为此,您可以在参数声明中编写#:keyword [argument-id default-value]

(define (welcome #:first [first-name "Anonymous"] #:last [last-name "Person"])
  (display (string-append "Welcome, " first-name " " last-name "!")))

因此,如果您在某个函数调用中不使用该关键字,则会使用默认值填充它。

> (welcome)
Welcome, Anonymous Person!
> (welcome #:first "John")
Welcome, John Person!
> (welcome #:first "John" #:last "Doe")
Welcome, John Doe!
> (welcome #:last "Doe" #:first "John")
Welcome, John Doe!

答案 1 :(得分:1)

@Alex Knauth的答案很棒。这是我不知道的事情。

这是另一种选择,虽然它不够灵活

(define (welcome (first "Anonymous") (last "Person"))
  (displayln (string-append "Welcome, " first " " last "!")))

这非常适合您的基本要求

> (welcome)
Welcome, Anonymous Person!
> (welcome "John")
Welcome, John Person!
> (welcome "John" "Doe")
Welcome, John Doe!

然而,Alex的解决方案有两个明显的优势。

  1. 可以按任何顺序调用参数
  2. 可以在没有名字的情况下指定姓氏