SSブログ

SML の long identifier のドットについて [SML]

Standard MLの文法について調べていて気付いたこと。

SMLでは Int.toString みたいなドットで区切られた識別子のことを long identifier というんだけど、これは The Definition of Standard ML では longx ::= x | strid1.・・・.stridn.x というBNFで定義している(2.4 Identifiers)。 また、2.5 Lexical analysis では "Each item of lexical analysis is ... or a long identifier." と書いていて、long identifier が(syntacticなカテゴリではなく)lexicalなitemであるとしている。

そうするとこのドットの前後にホワイトスペースは許容されるのかという疑問が生じてくる。 通常の lexical analysis ではホワイトスペースをトークン中に含まない。とはいえそういうことができないわけではない。 一方でプログラミング言語一般的にはドットの前後で改行できるのが普通だと思う。

各種のSML実装で比較してみると、なんと!許容しないほうが多数派だった。

  • 許容しない: MLton, MLKit, Poly/ML, Moscow ML, Hamlet
  • 許容する: SML/NJ, SML#, Alice ML

検証ソース

$ cat longvid-split.sml
val _ = print (Int
.toString (Array.
maxLen))

実行結果

$ mlton longvid-split.sml
Error: longvid-split.sml 2.1.
  Illegal token.
Error: longvid-split.sml 2.17.
  Illegal token.
Error: longvid-split.sml 1.16.
  Undefined variable Int.
Error: longvid-split.sml 2.2.
  Undefined variable toString.
Error: longvid-split.sml 2.12.
  Undefined variable Array.
Error: longvid-split.sml 3.1.
  Undefined variable maxLen.
compilation aborted: parseAndElaborate reported errors
$ mlkit longvid-split.sml
[reading source file:   longvid-split.sml]
longvid-split.sml, line 2, column 2:
  .toString (Array.
    ^
cannot lex "."
[[ERR in sub process:
  PARSE_ELAB_ERROR]]
Stopping compilation of MLB-file due to error (code 1).
$ polyc longvid-split.sml
Error- in 'longvid-split.sml', line 2.
unknown symbol .t
Error- in 'longvid-split.sml', line 2.
invalid identifer - Array.
Exception- Fail "Static Errors" raised
$ sml
Standard ML of New Jersey v110.76 [built: Tue Oct 22 14:04:11 2013]
- use "longvid-split.sml";
[opening longvid-split.sml]
[autoloading]
[library $SMLNJ-BASIS/basis.cm is stable]
[autoloading done]
16777215val it = () : unit
$ mosml -P full
Moscow ML version 2.10
Enter `quit();' to quit.
- use "longvid-split.sml";
[opening file "longvid-split.sml"]
File "longvid-split.sml", line 2, characters 0-1:
! .toString (Array.
! ^
! Lexical error: ill-formed token.
[closing file "longvid-split.sml"]
$ alice
Alice 1.4 ("Kraftwerk 'Equaliser' Album") mastered 2013/11/08
### loaded signature from x-alice:/lib/system/Print
### loaded signature from x-alice:/lib/tools/Inspector
### loaded signature from x-alice:/lib/distribution/Remote
- use "longvid-split.sml";
val it : unit = ()
### evaluating file /home/ether/longvid-split.sml
16777199-
SML# 2.0.0 (2014-04-04 11:47:08 JST) for i686-unknown-linux-gnu with LLVM 3.4
# use "longvid-split.sml";
8388607#
$ ./hamlet
HaMLet 2.0.0 - To Be Or Not To Be Standard ML
[loading standard basis library]
- use "longvid-split.sml";
val it = () : unit
[processing /home/ether/longvid-split.sml]
../longvid-split.sml:2.0-2.1: invalid character `.'

ちなみにこの実験中に MLKit では Array.maxLen が 123456789 と定義されていることにも気づいてしまった。たぶん嘘だと思う。

$ cat longvid.sml
val _ = print (Int.toString (Array.maxLen))
$ mlkit longvid.sml
[wrote X86 code file:   MLB/RI_GC/base-link_objects.s]
[wrote executable file: run]
$ ./run
123456789

nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。