2014-01-17 48 views
1

事實證明,谷歌單詞評論真的很難。F#語錄和代碼註釋表達式

是否可以使用引號抽象語法樹表示「註釋」表達式?

<@ //this gets ignored by the compiler and don't inject the quotation 
@> 

如果不是,您是否可以建議一種解決方法來表示評論?

回答

8

正如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 

這不是一個很好的做法,但是如果你想在手寫報價代碼中嵌入一些註釋,我想它是一樣的好。

+0

謝謝Tomasz! – Codingday

3

Expr類型,報價返回不包含任何方式來表示評論,所以這是不太可能的。