アカウント名:
パスワード:
s# pattern \#comment pattern # replacement \#comment replacement #xe;
perlの構文はどう考えても無茶だと思うぞ。 なんせ数ヶ月前に自分で書いたコードが自分自身で読めんのだ。 不思議だなぁ。
"TMTOWTDI" だけど、でもプログラムはわかるように書こうね>Perl プログラマ。
自分で書いたスクリプトがメンテできないからって、その責任を言語開発者に転嫁されても、正直困ってしまいます。
use strict や use warning プラグマも知らずに文句ばかり垂れてる Perl プログラマを見ているとさすがにやるせない気持ちになってきます。
そう思うなら別の言語を使えばいい。それこそ "TMTOWTDI" でしょ。君には (用途に応じて) 言語を選択する自由がある。;) つか、キッチリ書きたいならそも LL なんざ使わんで静的型付な言語を使えと。
まぁ、仕事だったらそうも言ってられんのだろうけど。。。酷いプログラムをメンテする人は言語を恨む前にまず酷いプログラムを書いた人を恨むべき。おいらだったらそれじゃあ C++ を恨まなきゃいけないところだよw (←って思いっきり私事だけど)
確かに Perl には文句の一つも言いたくなるような罠とかも結構あるっちゃあるけどね。サブルーチンの奥深くでは無意識のうちに $_ を使っちゃっていないか気をつけないといけない (もしくはいちいち local $_ しないといけない) ところとか、定数を定義する方法が不十分なところとか。オブジェクト指向が後付故に、メンバフィールドの定義をオブジェクト生成用のメソッド内でやらなきゃならない不自然さとか、非公開メンバを用意するにはトリッキーなテクニックが必要なこととか考慮しても、確かに大規模開発に向いているとはとてもじゃないけど言い難い罠。
でも、そもそもスクリプト言語って、そんな大規模な開発に向いてるソリューションとも思わんし。。。あーでも、最近はそう言うコンセンサスも結構あるみたいだし、Python とか、Ruby (on Rails) とか、結構うまくやってるみたいだし、Perl 6 も (ほんの一部でだけど) 期待されてはいるみたいだけどね。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
「毎々お世話になっております。仕様書を頂きたく。」「拝承」 -- ある会社の日常
文法で一番上の言語 (スコア:2, おもしろおかしい)
コンパイラーの本に載っているlex & yacc じゃ作れないだろ。
ここまではわかるんだ。
$tmp =~ s/lex/yacc/;
でも
$tmp =~ s#lex#yacc#;
で俺の知識では破綻する。「#」 はperlでコメントの意味もあるんだ。
そこで (スコア:1)
Re:文法で一番上の言語 (スコア:1)
foo
bar
ならfooとbarが順に実行されるし
foo bar
ならbarの戻り値を引数にfooが呼ばれるし
foo bar +
baz
だとbarとbazの戻り値を足したものを引数にfooが呼ばれるし
1.0
だと浮動小数点だけど
1.display
だと整数1に対してdisplayメソッドが呼ばれるんだぞっ
訳わからん [ruby-lang.org]わっ!!
Re:文法で一番上の言語 (スコア:1)
foo
bar
改行コード(文の区切り)で分けられた文を順次実行
foo bar
関数fooを呼び出す文(関数名から改行コードまでを引数と解釈)
foo bar +
baz
演算子「+」により改行コードが無視されるケース
1.display
オブジェクト指向言語としては珍しくない。定数と変数の区別なくオブジェクトとして扱われているだけ。
notice : I ignore an anonymous contribution.
Re:文法で一番上の言語 (スコア:0)
実はこの例の文法は難しくはないのだが。
Re:文法で一番上の言語 (スコア:1)
C言語でも*には単項演算子のポインタ参照、2項演算子のかけ算、/* */でコメントと1つの記号に複数の意味が持たされていますが、これもダメですか?
まぁ が読みづらいのは認めます。
Re:文法で一番上の言語 (スコア:0)
Re:文法で一番上の言語 (スコア:0)
#1075996の意図は、perlを馬鹿にした皮肉だと思うんだ。
もっと人間の限界性能を理解してくださいって意味で。
perlの構文はどう考えても無茶だと思うぞ。
なんせ数ヶ月前に自分で書いたコードが自分自身で読めんのだ。
不思議だなぁ。
Re:文法で一番上の言語 (スコア:1)
Re:文法で一番上の言語 (スコア:1)
"TMTOWTDI" だけど、でもプログラムはわかるように書こうね>Perl プログラマ。
自分で書いたスクリプトがメンテできないからって、その責任を言語開発者に転嫁されても、正直困ってしまいます。
use strict や use warning プラグマも知らずに文句ばかり垂れてる Perl プログラマを見ているとさすがにやるせない気持ちになってきます。
むらちより/あい/をこめて。
Re:文法で一番上の言語 (スコア:0)
Re:文法で一番上の言語 (スコア:1)
Re:文法で一番上の言語 (スコア:1)
そう思うなら別の言語を使えばいい。それこそ "TMTOWTDI" でしょ。君には (用途に応じて) 言語を選択する自由がある。;) つか、キッチリ書きたいならそも LL なんざ使わんで静的型付な言語を使えと。
まぁ、仕事だったらそうも言ってられんのだろうけど。。。酷いプログラムをメンテする人は言語を恨む前にまず酷いプログラムを書いた人を恨むべき。おいらだったらそれじゃあ C++ を恨まなきゃいけないところだよw (←って思いっきり私事だけど)
確かに Perl には文句の一つも言いたくなるような罠とかも結構あるっちゃあるけどね。サブルーチンの奥深くでは無意識のうちに $_ を使っちゃっていないか気をつけないといけない (もしくはいちいち local $_ しないといけない) ところとか、定数を定義する方法が不十分なところとか。オブジェクト指向が後付故に、メンバフィールドの定義をオブジェクト生成用のメソッド内でやらなきゃならない不自然さとか、非公開メンバを用意するにはトリッキーなテクニックが必要なこととか考慮しても、確かに大規模開発に向いているとはとてもじゃないけど言い難い罠。
でも、そもそもスクリプト言語って、そんな大規模な開発に向いてるソリューションとも思わんし。。。あーでも、最近はそう言うコンセンサスも結構あるみたいだし、Python とか、Ruby (on Rails) とか、結構うまくやってるみたいだし、Perl 6 も (ほんの一部でだけど) 期待されてはいるみたいだけどね。
むらちより/あい/をこめて。
Re:文法で一番上の言語 (スコア:0)
> なんせ数ヶ月前に自分で書いたコードが自分自身で読めんのだ。
> 不思議だなぁ。
おもしろおかしいと言うか、
素晴らしい洞察と言うか、
激しく同感と言うか、
Re:文法で一番上の言語 (スコア:0)
「単語の先読み」という概念を理解していれば、
べつに概念的には難しくはないと思うぞ。
それを実装しろと言われたら(破綻なく実装するのは)大変だけど。
でもどうせ、yacc使わずに素のC(やアセンブリ言語やLisp)で
パーサーを書くのは、楽とは言えないものの、
泣くほど大変なことでもないだろう。
なんといってもCなどの再帰が出来る言語で
それなりにパーサーが書ける素養が無ければ、
そこを飛ばしていきなりyaccを使っても、
(アクションの記述で再帰を意識できないと)
どうせハマルでしょ。
まずは簡単
Re:文法で一番上の言語 (スコア:1)
> 「#」 はperlでコメントの意味もあるんだ。
この2者(置換のセパレータとコメントの始まり)の区別の構文解析じゃなくて字句解析の領分だし、全然難しくない。
いやらしいのは
$tmp =~ s/lex/yacc/;
$tmp =~ s#lex#yacc#;
$tmp =~ s"lex"yacc";
を、どれも同じように構文解析させるところでしょう。
字句解析と構文解析は独立したものとして、字句解析は構文情報無しに出来るのが理想だけど、
これがあるために、字句解析時にある程度の構文認識をする必要がでてくるわけです。
ちなみに、この構文の元になったsedだと「sXlexXyaccX」なんて指定も出来たり。
まあ、sed の文法だと字句解析が要らないから、これでも構文解析は難しくならないのですが…
Re:文法で一番上の言語 (スコア:1)
素直に "s文字列" をひとつのトークンとして切り出して、
その後"s/A/B/"の形で解析すれば、yacc & lex で簡単に実装できます。
Re:文法で一番上の言語 (スコア:1)
> 素直に "s文字列" をひとつのトークンとして切り出して、
> その後"s/A/B/"の形で解析すれば、yacc & lex で簡単に実装できます。
それを指して「字句解析時にある程度の構文認識をする必要がでてくる」からいやらしいと言ったつもりでした。
あと、sの次に来るセパレータ文字列は「アルファベット・数字・空白以外の任意の文字」が使えたりしますが、lex では正規表現に後方参照を使えません。lexで記述するとなると
「s/[^/]*/[^/]*/[egimosx]」「s#[^#]*#[^#]*#[egimox]」…
などと、区切り文字列ごとにルールを書くが必要があります。
しかも、括弧などペアになる区切り文字を使って「s{yacc}{lex}」だとか「s<yacc>/lex/」なんて記述もできたりして、ややこしさ倍増です。