5

FSIバージョン:11.0.50727.1

それで、私は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

2 に答える 2

4

このトピックに関する仕様とドキュメントは非常に不明確だと思いますが、仕様では字句プリプロセッサディレクティブコンパイラディレクティブを明確に区別しています(§12.4を参照)。

コンパイラ指令は、ネストされていないモジュールまたは名前空間宣言グループでの次の形式の宣言です。

# id string ... string

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

私の解釈では、字句プリプロセッサディレクティブは、メインのコンパイルを実行する前に、実際には一部のプリプロセッサによって処理されるため、インデントはこれらにとって重要ではありません。

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

@unwindが言うように、ドキュメントには「インデントはプリプロセッサディレクティブにとって重要ではない」と記載されていますが、これはそのドキュメントページにリストされているプリプロセッサディレクティブ(レキシカルプリプロセッサディレクティブであり、コンパイラディレクティブではありません)にのみ適用されると思います。

于 2012-10-30T13:00:42.547 に答える
2

ドキュメントによると、それは他の何かが働いているに違いありません:

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

于 2012-10-30T12:42:43.220 に答える