[英]Exclusive OR in Scheme
计划中的独家或功能是什么? 我试过xor
和^
,但都给了我一个未绑定的局部变量错误。
谷歌搜索一无所获。
我建议你使用(not (equal? foo bar))
if if not equals works。 请注意,您的情况可能会有更快的比较器,例如eq?
据我所知,从R6RS (最新的方案定义)来看,没有预定义的独占或操作。 但是, xor
相当于布尔值not equals
所以如果没有内置函数,它就很容易自己定义。
假设参数仅限于方案布尔值#f
和#t
,
(define (xor a b)
(not (boolean=? a b)))
会做的。
如果你的意思是两个整数的按位xor,那么每个Scheme都有它自己的名字(如果有的话),因为它没有任何标准。 例如,PLT具有这些按位函数 ,包括bitwise-xor
。
(呃,如果你谈论布尔,那么是, not
& or
是......)
一种不同风格的答案:
(define xor
(lambda (a b)
(cond
(a (not b))
(else b))))
阅读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)))
(define (xor a b)
(and
(not (and a b))
(or a b)))
我最近修改了我的代码因为我需要'xor in scheme并且发现它不够好......
首先,我早先对“真实”的定义? 假设参数已经在布尔运算下进行了测试。 所以我改变了:
(define (true? x) (eqv? #t))
......为:
(define (true? x) (not (eqv? x #f)))
......这更像是'真实的'“真实”定义? 但是,因为'xor返回#t,如果它的参数有'奇数? “真实”参数的数量,对偶数个虚假案例的测试是等效的。 所以这是我修改过的'xor:
(define (xor . args)
(even? (count (lambda (x) (eqv? x #f)) args)))
由于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))))
> (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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.