我在寫第一個ppx擴展。這個想法是支持多態的print
函數,類似於Haskell中的show
。基本類型驅動ppx重寫
(我知道,其他更強大的解決方案存在,但我想更多地瞭解如何工作的。)
我採取的方法是非常相似的方法來描述here:我有一個mapper查找%[print <expr>]
標記,然後用<expr>
的字符串表示替換它們。例如,
[%print 1] ==> string_of_int 1
[%print "aksljd"] ==> "aksljd"
這正常工作對常量表達式,但我想,以支持地方<expr>
任意表達式。它應該用最終類型的打印機包裝它們。
我目前的做法是使用Typecore.type_expression
把一個Parsetree.expression
爲Typedtree.expression
,再搭配上Typedtree.expression
的exp_type
領域,並確定如何處理替換整個表達式。例如,對於type test = A of int | B of string
類型,我會將[%print A 1]
替換爲show_test (A 1)
那裏(show_test
必須按照約定存在)。
這不起作用,因爲Typecore.type_expression
將類型環境作爲參數,並且在重寫時無法獲取'當前類型環境',因爲還沒有執行類型檢查。 [%print 1 + 1]
與Typecore.type_expression Env.empty
導致Unbound value +
,因爲它應該。
有沒有人有解決這個問題?如果我完全走錯了方向,請隨時指出。 :p
這是什麼意思:'let f x = [%print x]'? – antron
好點。是的,多態性不適用於此。我沒有完全想到所有東西,這只是一個天真的第一次嘗試學習ppx :) – user1953221
給出這些信息,如何才能調用'show'的等效函數print :: Show a => a - > String'在Haskell的參數工作?在通過類型檢查之後,編譯器是否將它內聯,然後用其靜態已知的實現替換show的每個實例? – user1953221