在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

在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))))
但是,除了上面提到的,是否有一个类似“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”是什么意思,因为它是一个只有原子作为元素的列表。“你是说空列表被认为是一个原子列表,还是你指出了我的编码中的一些错误。我的意思是,空列表通常被认为是一个原子列表(或你想要的任何东西的列表)--这样做自然会消除你提出这个问题的困难。