在Scheme或Racket中检测函数的调用方
在Scheme或Racket中是否可以检测函数的调用方 例如,我可以编写一个函数来测试列表是否为原子列表,如下所示:在Scheme或Racket中检测函数的调用方,scheme,racket,Scheme,Racket,在Scheme或Racket中是否可以检测函数的调用方 例如,我可以编写一个函数来测试列表是否为原子列表,如下所示: (define atom? (lambda (x) (and (not (pair? x)) (not (empty? x))))) (define lat? (lambda (l) (define latt? (lambda (l) (cond
(define atom? (lambda (x) (and (not (pair? x)) (not (empty? x)))))
(define lat? (lambda (l)
(define latt?
(lambda (l)
(cond
((null? l) #t)
((atom? (car l)) (latt? (cdr l)))
(else #f))))
(if (null? l) #f (latt? l))))
但是,除了上面提到的,是否有一个类似“called by”的函数来执行以下操作:
(define lat?
(lambda (l)
(cond
((and (null? l) (called-by "lat?")) #t)
((atom? (car l)) (lat? (cdr l)))
(else #f))))
通常的方法是向函数中添加一些参数,或者像您那样通过内部定义进行循环。除此之外,没有可靠的方法找到函数的调用方 但在您的情况下,这似乎是一个很好的功能缺失——将其用于上述问题相当糟糕。内部助手版本没有问题。(它与任何其他语言都非常相似。)
最后,我希望
(lat?null)
返回#t
,因为它是一个只有原子作为元素的列表。非常感谢。我有点不清楚你所说的“最后,我希望(lat?null)返回#t”是什么意思,因为它是一个只有原子作为元素的列表。“你是说空列表被认为是一个原子列表,还是你指出了我的编码中的一些错误。我的意思是,空列表通常被认为是一个原子列表(或你想要的任何东西的列表)--这样做自然会消除你提出这个问题的困难。