アリスは括弧がお嫌い

アリプラシリーズの python 版…と言いますか、ちょっと C++ との比較。
perl 以外で適当なスクリプト言語を、と思っていたので、ruby にしようか、何にしようかと思っていたのですが、python を使ってみました。

で、ちろっと使ってみて、これはッ!!! と思ったのが括弧が少ないことです。
python 特有のタブ(空白でもOK)で揃える書式は、終わりの括弧を少なくするんですね。これって、XML と SOX の関係に似ていて、

<members>
	<person>
		<name>masuda tomoaki</name>
	</person>
</member>

のように XML では閉じタグが必要なのですが、SOX にはいりません。

members>
	person>
		name>
			masuda tomoaki

先の.NET勉強会でXMLのディスカッションの中で、XML はログ出力のようなものには向かない、と言いましたが、SOX はログ出力には向くのです。何故ならば閉じタグがないからです。

この閉じるという処理は、開始と終了が明確になると同時に、閉じるためには、開かないといけない、という作業が発生します…って、禅問答みたいで、なんだか分かりませんね。

例えば先の XML の例だと、新しく person タグを追加する場合には、

  1. mebers 閉じタグの前に書かないといけない。
  2. person の開始タグと終了タグを書かないといけない。
  3. name タグを挿入しないといけない。

という挿入の作業が発生します。これを SOX の場合では、

  1. person タグを追加する。
  2. name タグを追加する。

という追加の作業だけでいいんですね。この後ろに追加していく感覚は、プログラミングにおいても前から後ろへ書いていくという感覚と一致して、非常にやりやすいのです。
なので、LINQ が from から始まるのもその理由ですね。SQL が SELECT から始まるので若干やりづらいので、いきなり SELECT * FROM から書き始めてから、* 部分を書き直していきます。

さて、python は括弧が少ないので、こんな風に alice が書けます。

import sys
args = sys.argv
argc = len(args)

if argc == 1:
	print "alice don't like parentheses."
	print "please input parameters of this program."
else:
	for i,p in enumerate(args):
		print "%d: %s" % (i,p)

慣れも必要なんでしょうけど、インデントが深くなる時は、「:」を打つルールがあるみたいです(みたいです、と書くのは私が初学者だから)。

で、これを素直に C++ で書き直すと、

#include <iostream>
using namespace std;

// アリスは括弧がお嫌い
int main(int argc, char *argv[] )
{
	if ( argc == 1 ) 
		cout << "Alice は括弧がお嫌い" << endl,
		cout << "何かパラメータを指定してッ!!!" << endl;
	else
		for ( int i=0; i<argc; i++ ) 
			cout << i << ":" << argv[i] << endl;
}

え?何これ?って感じですが、中括弧を省くことができます。
まぁ、if 文や for 文の後の1行には括弧がいらないということは良く知られているのですが(逆に、やっちゃいけないよ、って言われてるし)、でも、「,」演算子はなかなか知られておりませんw。
カンマ演算子はC言語のマクロで良く使うのですが、カンマ演算子を使うと式をつなげられるのですね。なので、if 文の後ろにある 2 行が、何故???って感覚になるのです。なるでしょう?

ちなみに、else と for の間には文が入れられません。for は式ではなくて文だからなのです。なので、意図的に書いて括弧をなくしています。

それから連想で考えたのですが、python には end if というものがない。
VB には End if とか、Next がある。
Ruby にも end がある。
SQL には end がない。
LINQ にも end がない。
LISP には、括弧が必要。

なので、終了が必要ないというのは、先の SOX のように後ろへ後ろへとコードを書くことができるんですね。このあたり、もうちょっと考察をしたら書いていきます。

カテゴリー: 雑談, C++, python パーマリンク

アリスは括弧がお嫌い への6件のフィードバック

  1. k1496 のコメント:

    PHPが馬鹿にされてる理由の一つが閉じタグ ?> みたいですね。
    このあと空白が入るとHTMLヘッダーとして送られてしまうので。。

    ApacheかPHP.iniだったかでヘッダーだけ先に送らないように
    設定すれば良いのですが。

    ?>は非推奨ってことらしいです。

    職場のインド人はifの代わりに三項演算子で1行に書くのが好きみたいですね。

    LINQは知りませんでしたがSQLの関係代名詞をさらに関係代名詞で修飾した感じでしょうか。

  2. masuda のコメント:

    ?> が非推奨ってのが分からないんだけど…
    name:「
    みたいにインラインで書けるのが PHP の売りだし、ASP、JSP、ASP.NET もそうだしし。私としては、いまいち samrty のように独自タグというのは好きではなくて、HTML タグに潜ませる方式のほうがいいなぁと。なので、Perl の場合は、ヒアドキュメントにして、$name で埋め込ませていた。

    LINQ は、オブジェクトプログラマ向け SQL って感じかなぁ。内部的に SQL 文に変換して実行するから(オブジェクトと参照するときは別だろうけど)、基本は、SQL の作法(というか関数言語の作法)を知らないと、いまいち使いづらいと感じるかも。

  3. masuda のコメント:

    3項演算子と言えば、perl で、
    print “test” if ( $n == 0 ) ;
    と書いていた時期があった。for ループで last if なんとかと書いたりして。

    英語文法的には、このほうが正しいんだろうなぁ。
    if ( $n == 0 ), print “test”
    な感じで、カンマを入れたくなったりするのかも。
    後置の if 文の場合、実行文が先に来るので分かり易い、という話が当時(95年頃?)あったけど、果たしてどうなのか?

  4. k1496 のコメント:

    > ?> が非推奨ってのが分からないんだけど…

    どうもヒアドキュメントのView.phpの話ではなくControllerとかのincludeされる側の
    場合ってことみたいですね。。

    試しに ?> を消してみたら動きました。

    しかしView.phpで ?> を消すとエラーになります。。

  5. masuda のコメント:

    PHP は、HTML モードと PHP モードがあって、include をした時は、一度、HTML モードに切り替えられんだけど、include されるファイルに終端の ?> が無かったらエラーになるんだと思うんだけどなぁ。

    どちらかというと、
    > しかしView.phpで ?> を消すとエラーになります。。
    のほうの動きが正しくて、?> を消すと動くのが変なのでは?

    この2つのモード切り替えって、JSP も ASP.NET もそうだから、他のテンプレートを使うよりも分かりやすくていいと思う。そのまま、HTML 関係のデザイナで編集できるっていう利点もあるし。

    そう言えば、ASP.NET MVC の Razor では、デザインモードが利用できない。これって、デザインするのに直接 HTML タグを書かないと駄目、って形で時代に逆行している感じがする。Razor とか Smarty ってのは確実にプログラマ側の発想で、デザインサイドの発想ではないなぁと。

  6. masuda のコメント:

    なるほど、
    http://www.php.net/manual/ja/language.basic-syntax.instruction-separation.php
    を読むと、include される側の PHP は終了タグを省略したほうが無難なのね。

    でも、空白でおかしくならないように、HTML を作るってのが筋だと思うんだが。ヘッダ関係は無理か…というか、header 関数でヘッダを出力するから、それが include でつながっている(多分)ところがおかしくないかなぁと。

コメントは停止中です。