gpt4 book ai didi

ruby - 是否可以使用关键字参数传递函数

转载 作者:太空宇宙 更新时间:2023-11-03 17:03:42 25 4
gpt4 key购买 nike

您好,我正在尝试在 Ruby 2.0.0-p247 中实现这个 Common Lisp 宏:

(defmacro binary-cmp (a b &key (test-func '>))
`(funcall #',test-func ,a ,b))

采用 2 个参数和 1 个关键字参数 test_func 的二进制测试函数,test_func 默认为 gt proc。

gt    = -> (a, b) { a > b }
lt = -> (a, b) { a < b }
equal = -> (a, b) { a == b }

def binary_cmp (a, b, test_func: gt)
test_func.(a, b)
end

但这行不通,因为在 binary_cmp 中看不到外部:gt

我应该怎么做才能做到这一点?是否可以?或者有一种常见的做法吗?非常感谢。

编辑:

我需要关键字参数的原因是我的参数列表有 5 个参数,也许用户只需要默认的测试函数(比如 lt),或者也许有人想使用(gt ) 作为默认值。

最佳答案

这段 Lisp 代码在几个方面是糟糕的风格:

(defmacro binary-cmp (a b &key (test-func '>))
`(funcall #',test-func ,a ,b))
  • 它不应该是一个宏。它应该是一个函数。

  • 宏可以写得更简单。

FUNCALL 形式不是必需的,因为它不添加任何功能。由于根据设计 test-func 需要是一个函数名(FUNCTION#' 需要一个函数名),我们可以删除 FUNCALL#'。在 Lisp 语法中,列表的第一个元素是一个函数名。

(defmacro binary-cmp (a b &key (test-func '>))
`(,test-func ,a ,b))

作为一个函数,它只是:

(defun binary-predicate (a b &key (predicate '>))
(funcall predicate a b))

关于ruby - 是否可以使用关键字参数传递函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17526588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com