>buf = [] >for x in a > if x.hoge continue > if x.fuga buf += x.y >end > >みたいなのは、 >「1つの」ループの中に >色んな分岐やデータ収集が >ごちゃ混ぜなのが厳しいです。 それはごちゃまぜに書いているからであって、以下のようにすれば行の選択部分と行に対する処理の部分にきれいに分かれます。
buf = [] for x in a
if x.hoge continue
if !x.fuga continue
buf += x.y end
初めて覚えたプログラム言語=脳内基本構文 (スコア:0)
原始的であるため (覚えることが少ないため)、その後の言語は新しい概念を差分とし
て覚えればよかったぶん楽でした。(古い因習を引き摺る弊害もありますが)
いま初めてプログラム言語を覚えようとすると、言語以外の事にも色々気を配らなけれ
ばならないように思うので、大変な気がします。
ただ、だからといって箱庭の簡易言語がいいかというと、それも難しい問題です。
私はアイディアを脳内でコーディングする時には、様々な言語のいいとこ取りをするの
ですが、覚えたのが古い言語ほど現在メインで使用している言語に準ずるくらい基本文
法に馴染みがあるような気がします。
最初にオブジェクト指向言語を覚えた人は、無意識にそう考えるものなのでしょうか?
だいぶ矯正されたとは思いますが、私はいまだにスパゲッティ指向ですよ。:-P
最も最近覚えたプログラム言語=脳内基本構文 (スコア:0)
そうかなあ…?
私は逆に、
それまで知ってた言語のカッタルサに耐えられなくなって次の言語に乗り換える、
ってことを繰り返してたので、
脳内基本構文は今一番新しく覚えた言語になってます。
で、言われて気付いたのですが、それ多分逆なんですよ。
BASICは覚えることが「多い」んです。
BASICは「覚えること」が多いんです。
共通化して考えれる部分が少ないですから。
(私が知ってる)当時のBASICって、ほとんどの機能が「命令」でした。
そして命令は言語ビルトインであり、不動なものだった。
するとユーザはそれを「丸暗記」するしか無いん
Re: (スコア:0)
マテ
何を覚えてたんだって?
手続き型言語では繰返しは覚えるもんでないでしょ?
ごりごりと書くもので。
関数型言語だとか、Rubyではinjectとか使って自作するのかとは思いますが。
Re:最も最近覚えたプログラム言語=脳内基本構文 (スコア:1, 興味深い)
for「文」とかwhile「文」とかの文法を、です。
あ。(今は)文と式の違いを指摘したいわけではないので、
for「式」と呼ぶ言語であっても扱いは同じとします。
>ごりごりと書くもので。
それは(私の言い方でいえば)
繰り返しじゃなく、
繰り返しの中っていうか後に続く実行部分、です。
for (xxx) yyy
のyyyの部分ね。
今気にしてるのはそこじゃなく
for (xxx)
までの部分です。
>関数型言語だとか、Rubyではinjectとか使って自作
まあ結果的にはそうなんですが、
この繰り返しの自作の話は、
関数型言語限定の話題だと強く言い切る必要は無い話題だと
思うんです。
というのは、やってることは結局はコールバックだから。
手続き型大好きな人に簡単に説明するには
「Cのqsort関数を見てね」
というべきかな。
qsort関数を見て「これは手続き型言語のモノではない!」とか言う人はあまり見かけませんね。
>ごりごりと書く
最終的には書かないとならない処理は書かないとならないので、
その意味でいえばコードはちっとも短くならなかったりすること
もあるんですが、
そういう部分を「切り離せる」のは快適ですよ。
buf = []
for x in a
if x.hoge continue
if x.fuga buf += x.y
end
みたいなのは、
「1つの」ループの中に
色んな分岐やデータ収集が
ごちゃ混ぜなのが厳しいです。
これが
buf = a.where{|x| x.hoge}.where{|x| x.fuga}.select{|x| x.y}
(文法はRuby風ですが、
whereとかselectっていう語の選び方は、
RubyじゃなくあえてSQLにあわせてます)
なんて書けると、
「行を絞る部分」「列を絞る部分」(SQL風にいえばですが)
を「ばらばら」に扱えるんです。
扱うってのは、読んだり書いたり(修正したり)するときに、
切り離す単位が凄く判りやすいっていう意味。
メソッド+ブロックの単位で、
コードを気楽に切り貼りできます。
順番変えるとかもサクサクできるし、
変えたときにどう振る舞いが変わるかも「見ればわかるしょ」にかなり近い。
あと、ちょっと汚れた話。
上から目線の上流野郎どもが書いた仕様書には
気楽に「hogeなもののみ表示」とか「yカラムだけ表示」とか
日本語で書いてるわけだが、
上記のようにして、日本語とほぼ同じ粒度でコードが書けるようになると、
そういう場末SEじみた仕事も、
いくらかはラクになるんだ。
翻訳(ループへの展開)を人間にやらせるからバグが出るんだ。
言語にやらせろだ。
>手続き型言語では繰返しは覚えるもんでないでしょ?
>ごりごりと書くもので。
まあ仮に本当にそうだったとしても、私は「こんなに面倒ならば手続き型言語など要らぬ!」と涙するだけです。そして北斗もとい関数(ハイブリッド)言語に移行するだけ。
べつに「手続き型にこだわりたい」なんて全く思ってません(言ってもいません)。「BASICは」「Cは」「Rubyは」といっただけですし、それらに対して「こだわりたい」とも言ってない。
今はRubyですが、もっとラクなものを見つけたら乗り換えます。それだけ。
書くのが面倒だと自覚してしまった言語(特定言語なり方法論なり)に拘って「自滅」してしまいたくないので。
ボクは職場で殺される(言語とエンジニア生存論) (スコア:0)
そういえば、職場に居ますよ、
qsortが理解できなかった
とか言ってる奴がね。
普通のべた書きや関数(メソッド)呼び出しの形でのコーディングは
うまいし速い、とても立派な奴なんだが、
qsortのように高階じみてくると
途端に理解できなくなるらしい。
>翻訳(ループへの展開)を人間にやらせるからバグが出るんだ。
同チームの上流野郎にこのような話をしたことがあるんだが、
すると丸っきり逆の現象が起きた。
つまり、仕様書のほうが
ループ展開したような
凄く冗長で読みにくい日本語になったんだ…
この職場はたぶん、こいつ
Re: (スコア:0)
>for x in a
> if x.hoge continue
> if x.fuga buf += x.y
>end
>
>みたいなのは、
>「1つの」ループの中に
>色んな分岐やデータ収集が
>ごちゃ混ぜなのが厳しいです。
それはごちゃまぜに書いているからであって、以下のようにすれば行の選択部分と行に対する処理の部分にきれいに分かれます。
buf = []
for x in a
if x.hoge continue
if !x.fuga continue
buf += x.y
end
CやBASICなどまだリソースが潤沢でなかった頃から存在する言語で書くと、なぜか1ステップでも1バイトでも少なくみたいな貧乏
Re: (スコア:0)
> if !x.fuga continue
ああ、これは後から気付きました(^^)
が、それでも、
「その程度の綺麗さでは満足できない」自分が居ます。
Ruby(やLisp)を識ってしまった直後から。
(字面が)一個のループの中に詰め込まれてしまってる、ってのが痛い。
>なぜか1ステップでも1バイトでも少なくみたいな貧乏性
貧乏性の価値自体は理解するし(場面によって)賛同するんですが、
ほんとにC/BASICの書き方のほうが安価だったのか?ってのは
時々疑問に感じます。
どっちかというとCコンパイラの「最適化」によって得られる安価さのほうが支配的だったんじゃないか、と。
ローカ
Re: (スコア:0)
>一番素朴な実装なら
>その通りなのですが、
>実装を後から交換するのも楽々だってのも
>メソッドチェイン方式の利点だと思います。
それはメソッドチェインの影響ではなくて、抽象化されたデータ型の恩恵ですね。
抽象化されていれば良いので、こんな風にオブジェクト指向言語でなくても可能です。まどろっこしさが拭えないのは否めませんけど。
rows = SelectRow(rows, 'hoge')
rows = SelectRow(rows, 'fuga')
values = CollectCol(rows, 'y')
つまり、その利点を生み出す元は「言語の機能」ではなく「設計」に有る訳で、この言語じゃないとこ
Re: (スコア:0)
現実的には、言語畑では、
「文」は言語備え付けの特別な仕組みを、
いっぽう「式」は自作可能に繋がる何かを、
意味することが多いですね。
なので、「文」という言い回しの動向を監視することで、
世間の言語のなかでカスタマイズ不能な部分がどれくらい増減してるか、
の指標になりそうです。
Re: (スコア:0)
んじゃ、言い直すよ。
繰返しは覚える程のものじゃないでしょ。
って、ちょっとしたツッコミだけのつもりだったんだけど。
泣くほどのことじゃないっしょ。
以下、余談ですが、
> buf = a.where{|x| x.hoge}.where{|x| x.fuga}.select{|x| x.y}
> 「行を絞る部分」「列を絞る部分」(SQL風にいえばですが)
> を「ばらばら」に扱えるんです。
その通りなんだけど、その例だとなんか3回ループしてるよ?
buf = a.inject([]){|i,x| i << x.y if !x.hoge &&
Re: (スコア:0)
その積み重ねで今があるんですよ。
良い面だけじゃなく悪い面もね。
「覚えるほどのものじゃない」ものが幾つも幾つも有ることで
最終的には負荷になるわけ。
>なんか3回ループしてるよ?
ループするかどうかは、whereとかのメソッドの実装次第です。
>buf = a.inject([]){|i,x| i x.y if !x.hoge && !x.fuga}
それじゃ元の木阿弥です。
中でifとかandとかゴチャゴチャ書くと、判りにくい。
メソッドチェインだと、
チェインの「
Re: (スコア:0)
他の言語やパラダイムを学ぼうというのがタレコミ文の主旨だったはず…
と思う吉宗であった。
Re: (スコア:0)
うそこけ。3回ループしないで、実装できるもんならしてみろ。
> 中でifとかandとかゴチャゴチャ書くと、判りにくい。
主題はそこではなくて、トレードオフってのがあるでしょって事。
思想の問題ってトコロなツッコミな訳で。
まぁ、最初っから、くだらないツッコミと不毛な余談だから。
深く考えなくってもいいけどね。