计划中的独家OR

时间:2009-12-18 21:56:32

标签: lisp scheme logic

计划中的独家或功能是什么?我尝试了xor^,但两者都给了我一个未绑定的局部变量错误。

谷歌搜索一无所获。

9 个答案:

答案 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)))