racket - 你如何制作一个在 Racket 中使用关键字的功能

标签 racket

我已经看到 racket 中的一些函数或数据结构使用关键字 (#:foo),但我无法想象出我自己的函数来使用它们。 racket 文档只是松散地定义了关键字类似于符号,并且有点像这样,但是编写一个应该将关键字作为参数的函数只会导致以下错误:关键字后缺少参数表达式,这让我相信关键字与符号完全不同,因为它们不能作为值传递(除非被引用)。

我最熟悉的例子是match:

(...    
  (match foo
    [n #:when (< 10 n) "foo is greater than 10"]
    [_ "undefined"]))

所以我的问题是:如何创建一个函数或任何能够像上例中那样采用关键字的函数?

最佳答案

将关键字声明为过程参数定义的一部分,例如:

(define (my-sort lst #:reverse reversed? #:comparator cmp)
  (if reversed?
      (reverse (sort lst cmp))
      (sort lst cmp)))

(my-sort '(1 5 2 3 4) #:comparator > #:reverse #t)
=> '(1 2 3 4 5)

(my-sort '(1 5 2 3 4) #:reverse #f #:comparator >)
=> '(5 4 3 2 1)

正如@uselpa 在评论中提到的,这里是 documentation 中的相关部分.

关于racket - 你如何制作一个在 Racket 中使用关键字的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25909504/

相关文章:

lisp - 在满足谓词之前构建列表的替代方法?

scheme - Racket 中的结构有命名约定吗?

matrix - 函数式编程中的有效矩阵

lisp - 将列表中的字符串转换为 Racket 中的数字?

scheme - 方案中的可选参数和点

scheme - 计划中的时间

scheme - 方案(队列)的基本库

numbers - 如何计算Scheme中数字的位数之和?

scheme - 为什么我的对输出中出现 mcons 符号?

pattern-matching - racket:模式匹配函数参数