gpt4 book ai didi

lambda - 在 Jess 中传递带参数的 lambda

转载 作者:行者123 更新时间:2023-12-04 23:44:33 25 4
gpt4 key购买 nike

我已经定义了一个接受 lambda 的 bool Jess 函数,如下所示:

(deffunction at-least(?n ?lambda $?values)
(>= (length$ (filter ?lambda ?values)) ?n))

我可以这样调用:

(bind ?condition1 (at-least 1 (lambda (?arg) (= ?arg 0)) ?a ?b ?c))
(bind ?condition2 (at-least 2 (lambda (?arg) (< ?arg 0)) ?a ?b ?c))

这很好用。但是我在许多不同的地方使用相同的 lambda,所以我想通过为它们定义一些函数来使代码更简洁一些:

(deffunction fn-zero()
(lambda (?arg) (= ?arg 0)))

然后这样调用它:

(bind ?condition1 (at-least 1 (fn-zero) ?a ?b ?c))

这也很好用。

但是一旦我想添加一个参数,我就会得到一个错误信息。我有这段代码:

(deffunction fn-less-than(?x)
(lambda (?arg) (< ?arg ?x)))

(bind ?condition2 (at-least 1 (fn-less-than 0) ?a ?b ?c))

它抛出以下异常:

jess.JessException: No such variable x

我不知道我做错了什么。为什么这对没有参数的函数有效,但对有参数的函数无效?更重要的是:我怎样才能让它发挥作用?

最佳答案

Jess lambda 不是闭包,所以 ?x 在执行函数时不可用。在 Jess 中欺骗执行顺序的方法是评估字符串;我们希望在函数返回时将 ?x 的值硬编码到函数中,因此我们需要在组装函数时对 ?x 求值。像这样的东西可以正常工作:

(deffunction fn-less-than(?x)
(eval (str-cat "(lambda (?arg) (< ?arg " ?x "))")))

关于lambda - 在 Jess 中传递带参数的 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8240308/

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