事實證明,谷歌單詞評論真的很難。F#語錄和代碼註釋表達式
是否可以使用引號抽象語法樹表示「註釋」表達式?
<@ //this gets ignored by the compiler and don't inject the quotation
@>
如果不是,您是否可以建議一種解決方法來表示評論?
事實證明,谷歌單詞評論真的很難。F#語錄和代碼註釋表達式
是否可以使用引號抽象語法樹表示「註釋」表達式?
<@ //this gets ignored by the compiler and don't inject the quotation
@>
如果不是,您是否可以建議一種解決方法來表示評論?
正如Ganesh指出的那樣,Expr
類型無法表示註釋 - F#語句實際上只代表表達式的AST,而不是有關源代碼的完整信息(儘管您可以獲取文件名&位置引用的表達式)。
爲了以某種方式在引用中嵌入註釋,您需要想出一種將註釋嵌入到有效的F#代碼中的方法,這意味着某些東西 - 所以您可以定義一個虛擬函數comment
,做這樣的事情:
let comment (s:string) =()
let sample =
<@ comment "this is not ignored"
1 + (comment "this is also not ignored"
4) @>
然後,你可以寫上的有源圖案,看起來的形式comment "..."; <expr>
的表達和提取字符串和以下<expr>
:
open Microsoft.FSharp.Quotations
let (|Comment|_|) = function
| Patterns.Sequential(DerivedPatterns.SpecificCall <@@ comment @@> (None, [], [Patterns.Value(comment, _)]), body) ->
Some(unbox<string> comment, body)
| _ -> None
使用該模式,我們現在可以編寫一個匹配成功的(不完整)模式,當頂級表達式有一些註釋時body
表達式:
match sample with
| Comment(comment, body) ->
printfn "// %s\n%A" comment body
這不是一個很好的做法,但是如果你想在手寫報價代碼中嵌入一些註釋,我想它是一樣的好。
該Expr
類型,報價返回不包含任何方式來表示評論,所以這是不太可能的。
謝謝Tomasz! – Codingday