私は少しエキゾチックな状況があります。私は機能を比較する必要がありますが、むしろ "インスタンス"よりも "起源"で比較する必要があります。ここで私は実際に何を意味するか:どちらの場合もラケットの機能の "スマートな"比較
(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のデバッガが何とかそれを取得するからです。
ラムダ式の意味的平等をお探しですか? –
@JonChesterfield私はもっと "軽量"の変種だと思います。 2つの同じ関数が2つの異なる場所で宣言されている場合、 '#t'を得る必要はありません。関数の値がコード内の同じ行と位置に宣言されていれば、 '#t'を得るだけで十分です。 – dvvrd
これはおそらく解決可能です。 Iircラケットは、デバッグ情報を使って式にタグを付けます。そのため、1つのアプローチでは、それを解析することになります。それ以外には何も持っていませんが、少なくともあなたは象徴的な証明システムは必要ありません:) –