2012-10-30 11 views
5

FSIバージョン:11.0.50727.1F#でプリプロセッサディレクティブのインデントが敏感ですか?

私はF#シェルスクリプトに取り組んでいましたが、私はそれに驚きました。私はこれやったとき

は:

#if INTERACTIVE 
    #r "System.Data.dll" 
    #r "FSharp.Data.TypeProviders.dll" 
    #r "System.Data.Linq.dll" 
#endif 

open System 

を私はFSIにブロックを貼り付けるとき、私はFS0010のエラーを得ました。しかし、私が#r行をインデントしなかった場合、FS0010エラーは発生しません。私は、プリプロセッサの行がインデントセンシティブであることに驚いています。これはコンパイラの問題ですか、ここには何か他のものがありますか?

答えて

4

私は仕様とマニュアルは、このトピックにはかなり不明であると思いますが、仕様が字句プリプロセッサディレクティブコンパイラディレクティブ§12.4を参照)との間に顕著な違います:

コンパイラをディレクティブは、ネストされていないモジュールまたはネームスペース宣言グループの宣言で、次の形式です。

# id string ... string 

字句プリプロセッサディレクティブ#if#else#endif#indent "off"は、ディレクティブをコンパイラに似ています。 #if#else#endifの詳細については、§3.3を参照してください。 #indent "off"指令は§18.4で説明されています。

私の解釈は字句プリプロセッサディレクティブが実際にメインコンパイルを実行する前に、いくつかのプリプロセッサでhanledされているので、インデントがこれらには関係ないということです。

一方、#r,#load,#timeなどのディレクティブは、後でコンパイラによって処理されるため、通常のF#インデントガイドラインに一致する必要があります。 @unwindが言うように

documentation状態「インデントはプリプロセッサディレクティブのための重要ではありません」が、私はこれが唯一の字句プリプロセッサディレクティブであることドキュメントページに記載されているプリプロセッサディレクティブ(ないコンパイラディレクティブに適用されると思います)。

+0

おかげさまでトマース。私はそれを理解した後に回避するのは簡単でした。私はそれが本物の問題か、単に私が何かを誤解しているのかどうか疑問に思った。 –

+0

これは興味深い点です:-)これが実際にどこかで正しく記述されていれば私は非常に興味がありました。 –

2

the documentationによると、それは仕事で何か他のものでなければなりません:

インデントは、プリプロセッサディレクティブのために重要ではありません。

+0

あなたは面白いことを知っています - あなたがリンクしたドキュメントページを見ましたが、私はインデントについてその部分を逃しました。それは私がドキュメントをスキミングするために得るものです。 –

関連する問題