DelFusa Blog 総本山

プログラミングの話題とかです。

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| スポンサー広告 | --:-- | comments(-) | trackbacks(-) | TOP↑

≫ EDIT

新構文、uses_end

さて、前回でてきたDelphiの新しい構文?
uses_end;ですが、これはなんぞや。というものなんですけど

この新しい構文はなんと、私が作りました。


            ∫    _________
   ∧,,∧     ∬   /
   ミ*゚∀゚彡っ━~  < エッヘン
_と~,,  ~,,,ノ_.  ∀   \ 
    ミ,,,,/~), │ ┷┳━   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ .じ'J ̄ ̄| ┃
 ̄ ̄ ̄ ̄ ̄ ̄ ̄  ┻  Delphi言語を拡張しちゃいましたよ。


interface
uses
//ここにusesしたいユニットを書く!
uses_end;




いやあ、もちろん本当は構文拡張なんか、じゃないんですけどね。

前から、本当に嫌になっていたんですが
Delphiのusesには致命的な欠陥があるんですよ。

それが嫌で嫌でDelphiを辞めようかと何度考えた事か....(ウソ)


とある私のプログラムのusesをちらりとコピってみてみますと。

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, FileList, ComCtrls, StdCtrls, ELIEDIT,
 systemUnit,
 FileUnit,
 StringRecordList,
 StringUnitLight,
 StringUnitHeavy;

こうなっておりました。

usesされている個々のユニットの
StringUnitHeavyとかいう命名がダサイという諸問題は
この際、見逃してください。

※ usesしたら、サイズがでかくなってしまうからヘビーね。
  なんか文句あります?(`ε´)

さて、
ここから漏れがプログラムを組んでいて、何をどうしたくなるかというと

俺「んーーー、StringUnitLight.pasをusesから外そう」
→StringUnitLight,の行頭にコメントアウト記号を付けるだけ。
→ヨシヨシ満足満足。

俺「んーー、StringUnitHeavy.pasをusesから外そう」
→StringUnitHeavy,の行頭コメントアウト記号を付けるだけ…?!
→ぉぃ!コンパイルエラーじゃねーか!(怒
→StringUnitLightの最後の記号をカンマからセミコロンに変えて...
→StringUnitHeavyにコメントアウトつけて.......なんかめんどくさいな.....

俺「あ、やっぱりStringUnitHeavyは必要だな。usesに追加をしなければ...」
→・・・うぉぉぉぉぉおお、めんどくせ~~~


という、余計な気をまわさなくてはいけなくなるのです。

VCLの場合、あるコントロールを配置すると勝手に
ユニットがusesされます。
あとから、あるコントロールを配置するのをやめたとき、

pasファイルのinterfaceのusesをみて、
使われているように見える、そのユニットは
本当に現在のコンパイルに必要なのですか?
という事を調べる事が)頻繁に(俺だけ?あるわけですが、

そのときは、ひとつひとつusesから解除してコンパイルが通るかどうか、しらべなきゃいけません。

上記のComCtrls.pasなんか、その典型ですよね。

上記の例でいうと
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, FileList, {ComCtrls,} StdCtrls, ELIEDIT,
 systemUnit,
 FileUnit,
 StringRecordList,
 StringUnitLight,
 StringUnitHeavy;
わざわざ、こう書きます???コメント解除がめんどくさくないか?

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, FileList,
// ComCtrls,
 StdCtrls,
 ELIEDIT,
 systemUnit,
 FileUnit,
 StringRecordList,
 StringUnitLight,
 StringUnitHeavy;

このように改行いれて、ComCtrlsやStrCtrlsをコメントアウトON/OFFしてチェックする方が
まだ、楽でしょ。

こういうとき、Delphiのusesの、
各ユニットをカンマで区切りセミコロンで終了する構文が、
ほんと面倒なんですよ。


これをを知ってかしらずか、
Delphiの生みの親といわれる
ヘジルスバーグ氏は、C#をお作りになったときに
こういう事は回避しています。

というか、C++の元々の流れなの?
C#のusingではこういう問題は発生しません。
VB.NETでは、Imports構文になるんですよね。

 using System;
 using System.Windows.Forms;
 using System.Drawing;

こんな風に書くようです。

当たり前のように、ひとつひとつをコメントアウトON/OFFするのが楽です。


いや、、、、あえてC#の例をだすまでもなく
こんな珍妙な構文しているのはDelphiだけだろ?
JavaやC++系ではこんな構文、採用してないんじゃないの?
最後の一文字だけ区切り記号が違うのは、、、使いにくくて仕方ね~よ!


ということで、そのuses問題を回避したのが
uses_end;構文なのです。
このuses_end構文の開発に10年もかかってしまいました(w

uses
 TestA ,
 TestB ,
 TestC ,
uses_end;

こうやっておけば、そのようなめんどくささから解放されます。(字下げはご自由に。)

全ユニットを一度にコメントアウトしてもOKネ。
uses
// TestA ,
// TestB ,
// TestC ,
uses_end;


この構文、どうやってつくられているかといいますと....
実は仕組みはとっても簡単。uses_end.pasを作ってます。
----
unit uses_end;
interface
implementation
end.
-----
もちろん、何も実装コードがないから、作成されるバイナリサイズへの影響は0KB。

おほほほ。これを使って
usesに追加したり消したりをよくする人には
いろいろ便利。ご利用ください。

おっと、Delphiには、
usesを使う場所はinterface部とimplementation部
2カ所ありますよね。
両方ともでuses_end;は使えないんです。

単なるpasですから、二重でusesの宣言はできないのですよ。

発想を切替てミマショ。

end_uses.pasも作っておいてくださいね。

-----
interface

uses
uses_end;

implementation

uses
end_uses;

end.
-----
こうすりゃ、いいわけです。




これは、テストにでますよ!






          || ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄||
          || ほっぺに   。    ∧,,∧ 
          || 「ミ」を付ける \ ミ゚Д゚,,ミ
          ||________⊂ ⊂ ,,ミ
  ∧,,∧    ∧,,,∧    ∧,,∧    ...| ̄ ̄ ̄ ̄|
  ミ  ∧,,∧ ミ   ∧,,∧ ミ  ∧,,∧. |教授  .│
~(_ミ  ∧,,∧ __ミ  ∧,,∧__ミ   ∧,,∧ ̄ ̄ ̄
  ~(_ミ  ∧,,∧__.ミ  ∧,,∧__ミ ∧,,∧  はい、教授。
    ~( ,,ミ   ,,ミ~(,,,,ミ  ,,ミ~(_ミ   ,,ミ
      ~(___ノ  ~(___ノ   ~(___ノ

※黒板に書かれているのは
 ギコ猫AAをフサギコAAに変更する時の方法ですよ。
 フサギコ使いの、あなたには大切なテクニックです!

スポンサーサイト

| 未分類 | 00:50 | comments:7 | trackbacks:0 | TOP↑

COMMENT

おはようございます、hiderinです。私は、{ }使いですね(笑)
ユニットを簡単に有効/無効にできるこのアイディアは、
CodeGear Delphi Partner DVDにも収録されているICARUSという
フリーウェアと組み合わせると最強かも知れませんね。

ご存知かも知れませんが、ICARUSは、プロジェクトで使われてい
るユニットが必要かどうかを解析してくれるフリーソフトです。
Delphi2007のPartnerDVDで紹介されているのにもかかわらず、
コンパイラのバージョンにDelphi2007がないというのはご愛嬌と
いうことで(笑)

※私はICARUSを使っていませんけどね(^^;

CodeGear Delphi Partner DVD
http://cc.codegear.com/partners/delphi2007/index.html

ICARUSのダウンロードはこちら
http://www.peganza.com/

| hiderin | 2007/09/12 09:11 | URL | ≫ EDIT

ご紹介、貴重な情報、センキューっす!ICARUSは初めてしりました。
CompilerVersionはD2006とD2007で変わってないという話らしいので、普通に動きそうですね。

hiderinさんは、delphi-fanの方ですかしら?更新たくさんですごいっす。いつも楽しみにしております。

| ミ・д・彡 | 2007/09/12 09:25 | URL | ≫ EDIT

ありがとうございます。
私のレベルでは大したことは書けないのですが、
Delphiを使っていて気になることを書き留めています(^^;

こちらこそ、いつも楽しく読ませて頂いてます。

| hiderin | 2007/09/12 11:06 | URL | ≫ EDIT

C++系みたいに「最後のカンマは無視する」としてくれたらいいなーと前々から思ってました。
uses も解決するし、enum でも解決。
うーん、採用してくれないかなあ……。

| pik | 2007/09/14 16:21 | URL | ≫ EDIT

一応、言語を語りたいのであれば 構文解析の知識は持っていた方がよいです。PASCAL だと LL 文法ですね。
Wikipedia でよいですから「LL法」「LALR法」を参照してください。

PASCAL は LL文法で記述できますから、先読みの必要がありません。C 言語 (C++, C#, Java) は LALR 文法を必要とするため、基本的に先を読まないと意味がとれない状況があります。

LALR は LL に比べ構文的な自由度が広がりますが、極端な例だとソースの最後まで読まないと最初の1単語の意味が決定できない場合があります。これが言語レベルでの可読性につながります。
また、コードが間違いを含んでいるときに C/C++ 言語がとんでもないエラーメッセージを出すことの原因の一つでもあります。

点一つにも意味があるので、取り去ることはできないのです。

| 池 | 2007/09/14 23:09 | URL | ≫ EDIT

>最後の一文字だけ区切り記号が違うのは
Pascal では , は識別子の区切り(セパレーター)ですから、後続が無ければつけてはいけない。わけです。
C# の using では ; は定義の終了を表すので、すべての行につきます。

さて、Fusa さんの感じた問題はよくわかります。用は , の後ろにユニット名があればよいのですから私は以下の記法を使いっています。

uses
Windows
,Messages
,SysUtils
,Variants
,Classes
,Graphics
,Controls
,Forms
,Dialogs
;

一つ目のユニットだけ別扱いですが、ほとんど手間は掛かりません。どうでしょうか?

| 池 | 2007/09/15 13:37 | URL | ≫ EDIT

なるほど!カンマが行頭っていうのに不思議な間隔を感じましたが、いいアイデアですね。
池さん、教えていただいてありがとうございます。
「LL法」「LALR法」はコソーリ勉強しておくことにします。

hiderinさん、pikさん、コメントありがとうございます。ふとした思いつきとかでも、ブログネタで、おもしろいもんですね。
カンマの次にセミコロンがくるときは、カンマはなかった事にしてくれたらいいんすけど、なんちゃら法の部分でうまくいかないのかな。

某所さんとこで紹介されている、
DLangExtensions
http://bousyo.blog45.fc2.com/blog-entry-159.html
こちらあたりに、くみこまれませんかしら。。

それにしても、某所さん、更新されすぎだな...すげえ。

| ミ・д・彡 | 2007/09/18 10:54 | URL | ≫ EDIT















非公開コメント

TRACKBACK URL

http://delfusa.blog65.fc2.com/tb.php/81-4a0f1b3c

TRACKBACK

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。