私は関数型プログラミング、Lisp、ラムダ計算に非常に慣れていません。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))))))
)
私はこの2つの変換関数を見つけました:
(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 が必要な場所。コードに何か問題がありますか? または、何か不足していますか?
ありがとう