检测Scheme或Racket中函数的调用者

时间:2011-11-01 02:02:58

标签: scheme racket

在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))))

1 个答案:

答案 0 :(得分:5)

执行此操作的常用方法是向函数添加一些参数,或者像通过内部定义一样循环。除此之外,没有可靠的方法来找出函数的调用者。

但在你的情况下,似乎缺乏功能 - 使用它来解决上述问题非常糟糕。内部帮助器版本没有任何问题。 (它也与任何其他语言非常相似。)

最后,我希望(lat? null)返回#t,因为 是一个只有原子作为元素的列表。