繁体   English   中英

计划中的独家OR

[英]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

(呃,如果你谈论布尔,那么是, notor是......)

一种不同风格的答案:

(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM