在Scheme或Racket中是否可以检测函数的调用者?
例如,我可以编写一个函数来测试列表是否是原子列表,如下所示:
(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))))
但是,除了上述内容之外,是否有像“被叫”这样的函数来做这样的事情:
(define lat?
(lambda (l)
(cond
((and (null? l) (called-by "lat?")) #t)
((atom? (car l)) (lat? (cdr l)))
(else #f))))
答案 0 :(得分:5)
执行此操作的常用方法是向函数添加一些参数,或者像通过内部定义一样循环。除此之外,没有可靠的方法来找出函数的调用者。
但在你的情况下,似乎缺乏功能 - 使用它来解决上述问题非常糟糕。内部帮助器版本没有任何问题。 (它也与任何其他语言非常相似。)
最后,我希望(lat? null)
返回#t
,因为 是一个只有原子作为元素的列表。