我在试着实现一对教会伙伴兰博达加州大学。CLisp风格。
根据维基百科:
双≡λx.λy.λZ.Z x y
到目前为止,这是我的代码
(defvar PAIR
#'(lambda(x)
#'(lambda(y)
#'(lambda(z)
(funcall (funcall z x) y)))) )以下是我的第一和第二项职能:
(defvar FIRST
#'(lambda(p)
(funcall(p TRUE)))
)
(defvar SECOND
#'(lambda(p)
(funcall(p FALSE)))
)这两个函数从Int转换为ChurchNumber
(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))))))
)所以我要做的是:
(setq six (int2church 6))
(setq four (int2church 4))然后:
(setq P (funcall (funcall PAIR six) four))我得到了:
#<FUNCTION :LAMBDA (Y) (FUNCALL (FUNCALL F X) Y)>所以如果我这么做
(funcall #'FIRST P)我得到了这个错误:
*** - FIRST: #<FUNCTION :LAMBDA (Y) (FUNCALL (FUNCALL F X) Y)> is not a list我看不出我做错了什么。任何帮助都将不胜感激。
谢谢
发布于 2012-11-24 02:22:30
#'FIRST。
这意味着它首先使用的是函数,而不是您定义的变量。FIRST (来自标准库)是car的另一个名称,即它返回列表的第一个元素(因此错误抱怨P不是列表)。
Fix:(funcall FIRST P)
这将导致错误*** - EVAL: undefined function P。FIRST:#'(lambda (p) (funcall (p TRUE)))的定义造成的。
这意味着:返回一个具有单个参数p的lambda函数。该参数将被忽略。相反,调用全局函数p,将变量TRUE的值作为参数:(p TRUE)传递。然后将p的结果调用为(另一个)函数:(funcall ...)。
Fix:#'(lambda (p) (funcall p TRUE))
这将导致错误*** - :LAMBDA: variable TRUE has no value。TRUE和FALSE。
Fix:定义TRUE和FALSE。https://stackoverflow.com/questions/13537622
复制相似问题