在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))))
Run Code Online (Sandbox Code Playgroud)
但不是上面的,有一个像"被叫"这样的函数做这样的事情:
(define lat?
(lambda (l)
(cond
((and (null? l) (called-by "lat?")) #t)
((atom? (car l)) (lat? (cdr l)))
(else #f))))
Run Code Online (Sandbox Code Playgroud)
通常的方法是向函数添加一些参数,或者像通过内部定义一样循环.除此之外,没有可靠的方法来找出函数的调用者.
但在你的情况下,似乎缺乏功能 - 使用它来解决上述问题非常糟糕.内部帮助器版本没有任何问题.(它也与任何其他语言非常相似.)
最后,我希望(lat? null)返回,#t因为它是一个只有原子作为元素的列表.
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |