理论上,我的任务相当简单。
“创建一个以整数作为参数的过程。如果整数为0,则返回0.如果整数小于0,则返回-1。如果整数大于0,则返回1.
使用if / cond解决此任务不带(允许的唯一特殊表单是 define ,和,或)。“
一项非常不切实际的任务,但仍然是我课程的要求。我已经坚持了几个小时这个任务,所以我喜欢一些意见!
请记住,程序必须返回-1,0或1. #t或#f不够好。
答案 0 :(得分:6)
and
和or
都是if
的特殊版本。例如
(and a b) ; is the same as
(if a b #f)
(and a b c ...) ; is the same as
(if a (and b c ...) #f)
(or a b) ; is the same as
(if a
a ; though a is only evaluated once!
b)
(or a b c ...) ; is the same as
(if a
a ; though a is only evaluated once!
(or b c ...))
请注意,对于3个或更多元素,结果中包含and
或or
。您只需应用相同的转换,直到只有if
。
如果你想要这样的东西:
(if a 'x 'y)
你看到它显然是(or (and a 'x) 'y)
,因为它变成了
(if (if a 'x #f)
(if a 'x #f)
'y)
知道除#f
之外的所有值都被视为真值。 “反向”执行此操作的基本方法是了解and
和or
短路如何if
。如果您需要返回一个特殊值而不是您使用的谓词的结果,那么:
(and (null? x) 'empty-result)
如果您需要假值来继续逻辑,请使用or
(or (and (null? x) 'empty-result)
(and (pair? x) 'pair-result))
如果您需要默认设置并拥有or
,则只需添加它即可。
(or (and (null? x) 'empty-result)
(and (pair? x) 'pair-result)
'default-result)
如果您碰巧在外部有and
,则需要包裹or
以获取默认结果:
(or (and ...)
'default-result)
祝你好运!
答案 1 :(得分:2)
这是一个非常简单的实现:
(define (signum n)
(or (and (zero? n) 0)
(and (positive? n) 1)
(and (negative? n) -1)))
编辑:我在阅读Sylwester的帖子之前写了我的答案,但你肯定应该读一下这个结构如何运作的理论。