计划中的独家或功能是什么?我尝试了xor
和^
,但两者都给了我一个未绑定的局部变量错误。
谷歌搜索一无所获。
答案 0 :(得分:9)
我建议您使用(not (equal? foo bar))
如果不等于有效。请注意,您的情况可能会有更快的比较器,例如eq?
答案 1 :(得分:9)
据我所知R6RS(方案的最新定义),没有预先定义的异或操作。但是,对于布尔值,xor
相当于not equals
,因此如果没有内置函数,则自己定义非常容易。
假设参数仅限于方案布尔值#f
和#t
,
(define (xor a b)
(not (boolean=? a b)))
将完成这项工作。
答案 2 :(得分:7)
如果你的意思是两个整数的按位xor,那么每个Scheme都有它自己的名字(如果有的话),因为它没有任何标准。例如,PLT有these bitwise functions,包括bitwise-xor
。
(呃,如果你谈论布尔值,那么是的,not
& or
是......)
答案 3 :(得分:6)
有点不同的答案:
(define xor
(lambda (a b)
(cond
(a (not b))
(else b))))
答案 4 :(得分:2)
阅读SRFI-1为我的回答揭示了新的亮点。忘记效率和简单问题甚至测试!这种美丽可以做到这一切:
(define (xor . args)
(odd? (count (lambda (x) (eqv? x #t)) args)))
或者如果您愿意:
(define (true? x) (eqv? x #t))
(define (xor . args) (odd? (count true? args)))
答案 5 :(得分:0)
由于xor可以与任意数量的参数一起使用,唯一的要求是真实出现次数是奇数。它可以用这种方式大致定义:
(define (true? x) (eqv? x #t))
(define (xor . args)
(odd? (length (filter true? args))))
不需要进行参数检查,因为任何数量的参数(包括无)都会返回正确的答案。
但是,这个简单的实现存在效率问题:长度和过滤器遍历列表两次;所以我认为我可以删除这两个以及其他无用的谓词程序“真的吗?”。
价值奇数?当args没有剩余的真实评估成员时,receive是累加器(aka acc)的值。如果存在真实评估成员,则使用acc + 1重复,其余的args从下一个真值开始,或者计算为false,这将导致acc返回最后一次计数。
(define (xor . args)
(odd? (let count ([args (memv #t args)]
[acc 0])
(if args
(count (memv #t (cdr args))
(+ acc 1))
acc))))
答案 6 :(得分:0)
> (define (xor a b)(not (equal? (and a #t)(and b #t))))
> (xor 'hello 'world)
$9 = #f
> (xor #f #f)
$10 = #f
> (xor (> 1 100)(< 1 100))
$11 = #t
答案 7 :(得分:0)
(define (xor a b)
(and
(not (and a b))
(or a b)))
答案 8 :(得分:0)
我最近修改了我的代码因为我需要'xor in scheme并且发现它不够好......
首先,我早先对'真的?假设参数已经在布尔运算下进行了测试。所以我改变了:
(define (true? x) (eqv? #t))
... for:
(define (true? x) (not (eqv? x #f)))
...这更像是'true'的“真实”定义?但是,因为'xor返回#t,如果它的参数有'奇数? “真实”参数的数量,对偶数个虚假案例的测试是等效的。所以这是我修改过的'xor:
(define (xor . args)
(even? (count (lambda (x) (eqv? x #f)) args)))