方案 - 可选参数和默认值

nor*_*ner 4 scheme arguments optional-parameters racket

我目前正在研究Scheme,按照我的理解,程序可以接受任意数量的参数。

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

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

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

Welcome, <FIRST> <LAST>!
;; <FIRST> = "Julius", <LAST>= "Caesar"
Welcome, Julius Caesar!
Run Code Online (Sandbox Code Playgroud)

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

Welcome, Anonymous Person!
Run Code Online (Sandbox Code Playgroud)

我的代码有以下大纲,但正在努力解决如何完成它。

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

用法示例:

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

非常感谢任何帮助!

Ale*_*uth 6

在 Racket 中,执行此操作的方法是使用关键字参数#:keyword argument-id您可以在声明参数时使用我编写的关键字参数定义一个函数:

(define (welcome #:first first-name #:last last-name)
  (display (string-append "Welcome, " first-name " " last-name "!")))
Run Code Online (Sandbox Code Playgroud)

你可以这样称呼:

> (welcome #:first "John" #:last "Doe")
Welcome, John Doe!
Run Code Online (Sandbox Code Playgroud)

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

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

这样,如果您在某个函数调用中不使用该关键字,它将用默认值填充。

> (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!
Run Code Online (Sandbox Code Playgroud)

  • 我并不是想让它接受任意数量的参数;如果你需要,你可以写`(define (welcome #:first name #:last Last-name .rest-args) ...)` (3认同)