SchemeのコメントNo.28264
緒方聡 さん 10/05/14 01:09
 
Schemeには4種類のコメントがあって

- "#!" から行末まで
- ";" から行末まで
- "#|" から "|#" まで。ネスト可能
- "#;" の後ろの S 式の終わりまで

という風になっています。

最後の S 式コメントは

#; (* (+ 5 2) (+ 3 4)) (+ 1 2)

と書かれていた場合、コメントは #; のすぐ後ろの
対応する括弧までなので (+ 1 2) はコメントではありません。

このコメントは S 式をひとつだけコメントアウトできるので
非常に便利なので、色分けできるようにしたいのですが
知恵をお貸しください。

S 式の入れ子がない場合は、調文字列(複数行)の開始と終了を
以下のような正規表現にすることで色づけ可能です。

#;[ \t\n]*\(
\)

ただ、S 式の入れ子がある場合

#;[ \t\n]*\(([^(]*\(){2}
([^)]*\)){2}

たとえばこんな風に記述すれば、入れ子がひとつある S 式の
コメント、という風にできるかなと考えたのですが
どうもうまくいきません。

たとえば以下の場合です。

#; (1 (2 3) 4)

アウトライン枠が新たにできたので、秀丸でも Lisp 族の
コーディングを楽にできるようになるかな、と思っていますが
今のところコメントの色分けだけがネックです。

[ ]
RE:28264 SchemeのコメントNo.28268
秀丸担当 さん 10/05/14 10:01
 

>このコメントは S 式をひとつだけコメントアウトできるので
>非常に便利なので、色分けできるようにしたいのですが
>知恵をお貸しください。

複数行コメントのユーザー定義で、「オプション(O)>>」より入れ子の設定をす
ると、入れ子の解釈自体はなんとかなるかもしれませんが、通常の括弧でも色分
けされてしまうので、あまりいい解決ではないかもしれないです。
たとえば以下のようにします。

開始文字列:正規表現で「#;[ \t\n]*\(」
終了文字列:「)」
「子を含むのを許可」をON

開始文字列:「(」
終了文字列:「)」
「子になるのを許可」をON
「自身の入れ子を許可」をON

こうすると、#; の後の入れ子も解釈できると思います。
しかし、コメントではない通常の ( ) のペアも色分けされてしまい、意味が無
いかもしれません。

いまのところ、現状のユーザー定義の方法では、これが限界かもしれないです。
あるいは、括弧の組み合わせに応じた定義をたくさん書いておくとなんとかなる
かもしれないですが、非常に大量で複雑なことになってしまうかもしれません。

「入れ子のみ可能」というような設定があったらいいかもしれないですが、今の
ところな無いです。そういう設定もあったらいいということで今後のネタにさせ
ていただこうと思います。

[ ]
RE:28264 SchemeのコメントNo.28269
colder さん 10/05/14 12:08
 
colderです。

これでどうでしょうか。

/<HilightMulti>
/0003,20002,0,0,2,"#!",3,"$"
/0003,20002,0,0,2,";",3,"$"
/0003,3060002,0,0,2,"#|",2,"|#"
/0003,30002,0,0,3,"#;\\s*\\(",2,")"
/0000,50002,0,0,2,"(",2,")"
/0003,3060002,0,0,2,"(",2,")"


[ ]
RE:28269 SchemeのコメントNo.28272
秀丸担当 さん 10/05/14 13:10
 

「(」〜「)」を2つ定義して別々の条件にするとは、思いつきませんでした。
これは妙案ですね。
この方法にすると確かにできました。

[ ]
RE:28269 SchemeのコメントNo.28277
緒方聡 さん 10/05/15 10:29
 
colderさん

私の環境でも出来ました。

出来たとしても制限がつくかな、と思っていたのですが
これはすばらしいですね。

ありがとうございます。


[ ]
RE:28277 SchemeのコメントNo.28308
緒方聡 さん 10/05/18 19:38
 
お世話になります。

S 式コメントを勘違いしていました。
下記の場合、それぞれ:

(+ 1 #;(* 2 3) 4) ⇒ (+ 1 4)
(list 'x #;'y 'z) ⇒ (list 'x 'z)
(* 3 4 #;(+ 1 2)) ⇒ (* 3 4)
(#;sqrt abs -16) ⇒ (abs -16)
(list 'a #;(list 'b #;c 'd) 'e) ⇒ (list 'a 'e)
'(a . #;b c) ⇒ '(a . c)
'(a . b #;c) ⇒ '(a . b)

右矢印以降のように解釈されるのですが、
一番下に示した例が鬼門で、これが表せません。

現時点の定義(最後に貼ってあります)では、

'(a . b #;c) ⇒ '(a . b

のようになり、終わりの括弧もコメントに
含まれてしまいます。

上記以外は一応判定に成功しています。

実は、成功しているパターンも、コメントの終わりを
空白で判断しているので、そうならないように
したいのですが、良い案はあるでしょうか?

なお、コメントにこだわるのは、
見た目のよさもあるのですが
マクロ処理した際に、
コメント部分かそうでないかを
判断したいためです。




/<HilightMulti>
/0003,00020002,00,00,00010003,"#;\"([^\\\\\"]|\\\\.)*",00010003,"\""
/0003,00020002,00,00,00010003,"#;[^ \\t\\n\\(][^ \\t\\n\\)]*",00010003,"[ \\
t\\n]"
/0003,00020002,00,00,00000002,"#!",00010003,"$"
/0003,00020002,00,00,00000002,";",00010003,"$"
/0003,03060002,00,00,00000002,"#|",00000002,"|#"
/0003,00030002,00,00,00010003,"#;\\s*\\(",00000002,")"
/0000,00050002,00,00,00000002,"(",00000002,")"
/0003,03060002,00,00,00000002,"(",00000002,")"

[ ]
RE:28308 SchemeのコメントNo.28309
秀丸担当 さん 10/05/19 10:24
 

複雑になってきているので全てカバーできるか自信がありませんが、
一番優先順位の高いところに

 開始「#;[a-z]+」
 終了「.*?」
 子になるのを許可

を入れたらサンプルのケースでは大丈夫になりました。

[ ]
RE:28309 SchemeのコメントNo.28310
緒方聡 さん 10/05/19 21:01
 
ありがとうございます。

終了条件が珍妙ですね。初めて見ました。

[ ]
RE:28310 SchemeのコメントNo.28861
緒方聡 さん 10/09/06 01:05
 
お世話になっています。

それから時間が経過していますが、
現在は以下のようになっています。

/<HilightMulti>
/0014,00020002,00,5C,00000002,"\"",00000002,"\""
/0014,00020002,00,00,00000002,"#\\",00010001,"(.|space|newline|\\n)"
/0003,00020002,00,00,00000002,"#!",00010003,"$"
/0003,00020002,00,00,00000002,";",00010003,"$"
/0003,03060002,00,00,00000002,"#|",00000002,"|#"
/0003,00030002,00,00,00010003,"#;\\s*[#'`]{0,1}\\s*\\(",00000002,")"
/0000,00050002,00,00,00000002,"(",00000002,")"
/0003,03060002,00,00,00000002,"(",00000002,")"

この状態で、以下の Scheme の擬似ソースコード



(if
  (if
    (if
      (if
        (if
          (if (if (if (if)) (and)) (if))
          )))))

の 6 行目を

(if
  (if
    (if
      (if
        (if
          #;(if (if (if (if)) (and)) (if))
          )))))


上記のようにすると、期待する動作としては
6 行目の最後の括弧までがコメント扱いになるところが
and)) の部分までしかコメントになりません。

上のほうに書かれている (if をひとつでも削ると
最後までコメントになります。

逆に、上のほうに (if を増やすと、コメントの範囲が
どんどん削られてしまいます。

これは括弧がある程度ネストしていると、
処理ができなくなってしまう、ということでしょうか。

環境は 32bit 日本語版 v8.00b44 と v8.01a で
どちらも再現します。

[ ]
RE:28861 SchemeのコメントNo.28865
colder さん 10/09/06 13:47
 
colderです

>これは括弧がある程度ネストしていると、
>処理ができなくなってしまう、ということでしょうか。

これは、ヘルプにもありますが、8段階までしかネストできないらしいです。

>http://homepage3.nifty.com/kons/hidemaru/helpsite/hidemaru/html/080_Config_HilightUser_Prop.html



/0000,00050002,00,00,00000002,"(",00000002,")"

/0000,00000004,00,00,00000002,"(",00000000,""
に変更すると、コメント部分ではない"()"はネストしなくなるので、少しだけコメン
トの表示が改善します。


[ ]
RE:28861 SchemeのコメントNo.28867
秀丸担当 さん 10/09/06 16:40
 

colderさんありがとうございます。
言われている通り、入れ子にできるのが8段階までという仕様がありました。
これを増やすのは仕組み的に難しいところがあるのですが、現状では8段階まで
ということでお願いします。

[ ]
RE:28865 SchemeのコメントNo.28868
緒方聡 さん 10/09/06 17:03
 
colderさん、こんにちは。

>/0000,00050002,00,00,00000002,"(",00000002,")"
>を
>/0000,00000004,00,00,00000002,"(",00000000,""
>に変更すると、コメント部分ではない"()"はネストしなくなるので、少しだけコメ
>ントの表示が改善します。

確認できました。
少しだけ改善できたようです。

この形式のコメントは気を付けて使うようにします。

[ ]