2011-11-01 60 views
2

在方案或球拍中是否可以检测功能的主叫方?检测方案或球拍中功能的主叫方

例如,我可以写一个函数来测试一个列表是原子的列表如下:

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

回答

5

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

但在你的情况下,它似乎是一个很好的缺乏功能 - 使用它的上述问题是非常糟糕的。内部帮手版本没有问题。 (这也是非常相似,任何其他语言。)

最后,我期望(lat? null)回到#t,因为它只具有原子作为元素的列表。

+0

非常感谢。我有点不清楚你的意思,“最后,我希望(lat?null)返回#t,因为它是一个只有原子作为元素的列表。”你的意思是空列表被认为是一个原子列表,或者你在编码时指出了一些错误。 –

+3

我的意思是说,空列表通常被认为是一个原子列表(或任何你想要的列表) - 并且这样做会自然消除将你引向这个问题的难题。 –