我有點異國情調。我需要比較功能,而不是「起源」而不是「實例」。在這裏我實際上意味着:「智能」比較球拍中的功能
(define-values (a b c d) (values #f #f #f #f))
(define (f x)
(let ([g (λ (y) (printf "Please tell ~a this is ~a\n" x y))]
[h (curry printf "Don't tell ~a this is ~a\n" x)])
(if a
(set! b g)
(set! a g))
(if c
(set! d h)
(set! c h))))
(f "me")
(f " me")
(a "possible")
(d "impossible")
(equal? a b) ; <==== Is it possible to compare these guys
(equal? c d) ; <==== to get #t in both cases?
在這兩種情況下,我們獲得的功能,兩個不同的「實例」(即使有捕獲不同的值),但在源代碼中的相同位置這兩個聲明。當然,獲得這些功能主體的實際文本將解決這個問題,但這裏的其他答案告訴我們,在Racket中這是不可能的。有一些技巧可以幫助我嗎?
編輯: 這不是關於函數的理論等價性的問題。這完全是技術問題,而非編譯代碼中Racket的函數表示。因此可以用以下方式重新表達:我可以從「用戶」代碼中得到一些例程的行號嗎?我想這應該是可行的,因爲Racket調試器以某種方式獲得它。
你在尋找lambda表達式的語義相等嗎? –
@JonChesterfield我認爲更「輕量級」的變體。如果在兩個不同的地方聲明兩個相同的函數,則不需要'#t'。如果函數值在代碼中的同一行和位置中聲明,那麼獲得'#t'就足夠了。 – dvvrd
這可能是可以解決的。 Iirc racket使用調試信息標記表達式,因此一種方法是解析該信息。除此之外,我什麼都沒有,但至少你不需要象徵性的證明系統:) –