我对函数式编程、lisp 和 lambda 演算非常陌生。我试图用 Common Lisp Lambda Calc 风格实现 AND 运算符。
来自维基百科:
AND := λp.λq.pqp
到目前为止,这是我的代码:
(defvar TRUE #'(lambda(x)#'(lambda(y)x)))
(defvar FALSE #'(lambda(x)#'(lambda(y)y)))
(defun OPAND (p q)
#'(lambda(f)
#'(lambda(p) #'(lambda(q) (funcall p (funcall q(funcall p))))))
)
我发现了这两个转换函数:
(defun church2int(numchurch)
(funcall (funcall numchurch #'(lambda (x) (+ x 1))) 0)
)
(defun int2church(n)
(cond
((= n 0) #'(lambda(f) #'(lambda(x)x)))
(t #'(lambda(f) #'(lambda(x) (funcall f
(funcall(funcall(int2church (- n 1))f)x))))))
)
如果我做:
(church2int FALSE)
我有 0。如果我这样做:
(church2int TRUE)
我有
#<FUNCTION :LAMBDA (X) (+ X 1)>
我认为没关系。但如果我这样做:
(church2int (OPAND FALSE FALSE))
我有:
#<FUNCTION :LAMBDA (Q) (FUNCALL P (FUNCALL Q (FUNCALL P)))>
我应该在哪里有 0。我的代码有问题吗?还是我错过了什么?
谢谢