我正在研究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!
非常感谢任何帮助!
答案 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的解决方案有两个明显的优势。