你能简化一个“问题”吗;“不是表达”;在Clojure?
用户将键入(eval not’(not(和x y)),我希望它返回=>(或(not x)(不是y))。在保持cond使用的同时,这是否可能。希望不要使用宏,谢谢。这是一个关于遵循布尔运算规则进行列表操作的问题。不需要学习宏 您的起点是正确的,但需要了解:你能简化一个“问题”吗;“不是表达”;在Clojure?,clojure,Clojure,用户将键入(eval not’(not(和x y)),我希望它返回=>(或(not x)(不是y))。在保持cond使用的同时,这是否可能。希望不要使用宏,谢谢。这是一个关于遵循布尔运算规则进行列表操作的问题。不需要学习宏 您的起点是正确的,但需要了解: 要应用的规则(例如,notover和看起来像(not(和x y))→ (或(非x)(非y)),但也适用于非上方的非、或等 何时应用递归(例如,如果参数是序列,则可以分布not,但非序列结束递归)并小心地再次调用eval not 请记住,函数
- 要应用的规则(例如,
overnot
看起来像和
→ <代码>(或(非x)(非y)),但也适用于(not(和x y))
上方的非
、非
等或
- 何时应用递归(例如,如果参数是序列,则可以分布
,但非序列结束递归)并小心地再次调用not
eval not
或开头,因此条件中第一个测试表达式旁边的返回值如下所示:
(列表)或(eval not(列表非x))(eval not(列表非y)))
…其中x
和y
是输入的实际部分,位于输入的第二个元素和之后
我建议您检查输入本身是否是序列,这样您就可以开始为这些部分命名,否则代码很快就会变得混乱
根据上述内容,代码开始如下所示:
(定义评估非[输入]
(续)
当这些事情发生时
(和(=”非(第一次输入))
(第二次输入)
(='和(第一(第二输入)))
那么
(设[x(第n次(第二次输入)1]
y(第n次(第二次输入)2)]
;分发“不”在“上面”和“这里”。。。
其他情况。。。
))
我希望这有助于您解决家庭作业。如果您不使用宏,您认为输入将得到什么?宏可以做到这一点,但为什么?而且,只有宏可以重新编写代码,这是您的要求)。函数可以接受引用的列表”(不是(和x y))
并返回引用的列表”(或(不是x)(不是y))
,我认为这是我想要的。真正的问题是这里没有问题,除了“可能吗?”,没有尝试或研究。我的尝试就是上面写的代码。我想知道如何开始这样做
(defn eval-not
[input]
(cond
(and (seq? (second input)) (= 'and (first (second input)))) ;(do x here which -> (or (not x) (not y))
))