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

Har*_*ier 2 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))))
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)

Eli*_*lay 5

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

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

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

  • 我的意思是空列表通常被认为是一个原子列表(或任何你想要的列表) - 这样做会自然地消除导致你回答这个问题的难度. (3认同)