2011-11-01 96 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

我的意思是說,空列表通常被認爲是一個原子列表(或任何你想要的列表) - 並且這樣做會自然消除將你引向這個問題的難題。 –