Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
Matzにっき(2005-07-22)
[go: Go Back, main page]

«前の日記(2005-07-21) 最新 次の日記(2005-07-23)» 編集

Matzにっき

<< 2005/07/ 1 1. 不採録
2. ブロックパラメータの新文法
3. 今日のハック
2 1. 降れば土砂降り
2. お片付け
3 1. 断食日曜日
4 1. プログラミング言語 citron
2. ESR: "We Don't Need the GPL Anymore"
5 1. バグトラッキングシステムへの不満
6 1. WikiNameのないWiki
2. 究極の俺オープンソース
7 1. UNIX USER 9月号
2. 北海道
3. まつもとゆきひろの写真
4. kmyacc
8 1. 北海道へ
2. 今日のハック
9 1. オープンソースカンファレンス2005 in Hokkaido
2. 懇親会
3. 今日のハック
4. なぜテスト駆動が身につかないか
5. 発熱
10 1. 白石ワード
11 1. 日経Linux 9月号
2. Rastへのメールのとりこみ
12 1. 計算機システム特別講義IA
2. 今日のハック
3. Rastへのメールのとりこみ(2)
4. 計算機システム特別講義IA
13 1. Rastへのメールのとりこみ(3)
2. 今日のハック
3. 商談
4. 筑波へ
5. 計算機システム特別講義IA
14 1. 計算機システム特別講義IA 本番
2. 夕食
15 1. 計算機システム特別講義IA 本番(2日目)
2. ACとの遭遇
16 1. お宿
2. 帰還
3. 保護期間延長で、埋もれる作品激増?/著作権は何を守るのか
17 1. 松江
18 1. 日経Linux 9月号
2. ピアノ発表会
3. 海の日
19 1. ルびマッ
2. 日経Linux 9月号
3. 情報科学若手の会
20 1. 御中元
2. オープンソース開発で得られる喜び「スゲェ感」
21 1. Perlの文法を持ったJavaベースのスクリプト言語 - Sleep 2.0公開
2. 今日のハック
3. lambda式
22 1. 新lambdaの実装
2. 新lambdaの文法
3. 吹奏楽発表会
23 1. 掃除の日
24 1. 松江
25 1. 健康診断
26 1. FEEDBRINGER
2. OSCONチケット
3. RubyConfチケット
4. ゲラ
27 1. 夏のプール
2. 散髪
3. lambda式
4. FEEDBRINGER (その2)
28 1. 書籍『オープンソースがビジネスになる理由』
2. ローカル変数のシャドーイング
3. 今日のハック
4. 大家族
29 1. Matz日記分室: マイクロソフトのオープンソース論
2. 「iPodなどを私的録音補償金制度の対象に」JASRACなどの7団体が声明
3. 書籍『オープンソースを理解する』
30 1. 紙芝居
2. 買いもの
3. 焼肉
31 1. デジタル放送の「コピーワンス」が運用見直しへ−年内に結論。家庭内IP伝送も視野に
2. 松江
>>
Dr.Web 予測するアンチウイルス  Hiki も使った新サイト、10/18 リニューアルオープン!

2005-07-22 [長年日記]

_ [Ruby] 新lambdaの実装

lamdaの記号をどうするかという問題はあるものの、 実際に動かしてみないとイメージが掴めないので、 ごそごそとparse.yをいじってみる。 半日ほどのハックで動くようになった。

NODE_ARGSの構造が変化してしまった。 Yarvに迷惑がかかるかな。

とりあえず、動いてはいるようだ。 これをコミットしたものか。

_ [Ruby] 新lambdaの文法

で、実装した新lambdaはlambdaに対応する記号の部分だけ lexerをいじれば簡単に変更できる。

今のところ、最初の案の通り「->」を使っているのだが、 「 が来るのは激しく気持ち悪い気もしますが……">関数型言語の文化圏からすると引数の前に -> が来るのは激しく気持ち悪い」という指摘も受けている。ここで案についてまとめておこう。

->

もともとの案。実はPerl6から来ている。Perl6ではRubyのブロック相当を実現する文法として、 「->」が使われており、たとえばfor文が

for list -> x { ... }

のような文法になっている。「->」でパラメータに代入しているというイメージか。 また、ここから派生してクロージャは「-> x { ... }」で表記している。

Perl6はRubyと文化圏が近いため、参考にするのは悪くない、ような気もするが、 そもそもPerl6はいつ実用化されるのか、とか、使われないんじゃないだろうか、 とかいう懸念もある。この記法はブロックとして使われるときには(代入を想起させるので)、 そんなに悪くないんだけど、単体のlambda式として考えると

proc = ->(x, y) { ... }

という記法で、あんまり関数っぽくない。

\

Haskellではlambdaにバックスラッシュが用いられている。 これは「\」がギリシャ文字のlambda(λ)に似ているから、らしい。

それは分からないでもないが、UNIX文化圏ではエスケープの意味が強すぎるので 受け入れられないような気がする。

proc = \(x, y) { ... }

では、エスケープされた括弧というイメージが大きすぎるのではないか。 文化の違いというのは大きいものだ。

あと、フォントによっては「¥」マークになってしまうのも痛い。

\\

じゃあ、バックスラッシュ二つ重ねるのはどうだろう。

proc = \\(x, y) { ... }

ひとつだけよりはマシのような気がする。が、

ary.each \\(x) { ... }

という使われ方を考えると、視覚的なヒントが少な過ぎる。 この記号を採用した場合にはlambdaとしてだけ使い、 ブロックの記法には使わないようにすべきだろうな。

この案も「¥」マーク問題を無視できない。

ま、結局はブロックとlambdaのどちらに重きを置くかという点のような気がする。 もともと現在のlambdaのパラメータ指定がメソッドの引数と同一でないのが最大の不満だったので、 lambdaの方を強調すべきなのかもしれないが。

現時点では、各案に順位を付けられるほど考察が進んでいない。

_ [家族]吹奏楽発表会

長女の吹奏楽の発表会で県民会館へ。

ついこの間始めたばかりなのにもう発表なのか、と思わないでもないが、 一生懸命やっているようだった。もっとも、彼女の演奏している音が識別できたわけではないが。 団体だとその辺は有利だよな。本人曰く、「めっちゃ緊張した」そうだが。

同じ1年生でもパーカッションの娘は、出来がはっきりわかっちゃうから大変だよなあ。

本日のツッコミ(全17件) [ツッコミを入れる]
_ sumim (2005-07-24 03:23)

#' は駄目ですか?

_ まつもと (2005-07-24 08:22)

コメントですからねえ。> #'

_ 通りすがり (2005-07-24 16:26)

ここはやはりPrologっぽく「-:」でどうでしょう……といいつつ意味として合うのかすらよく解らないのですが

_ tez (2005-07-24 19:01)

if() とか elsif() みたく記号じゃなくて文字にすればよいのでは

_ 通りすがり (2005-07-24 22:40)

> if() とか elsif() みたく

そもそもが lambda というキーワードを導入したくないという話だったような。

_ まつもと (2005-07-24 22:52)

lambdaはわりと広く使われていますからねえ。予約語を増やすのはローカル変数とぶつかったときに悲しいので、最後の手段にしたいです。lambdaでなくてfuncとかなら名前としてはそんなにダメじゃないと思うんですけどねえ。

_ ななしん (2005-07-24 22:55)

仮引数をブロックの外に出すことに抵抗を感じます。
ary.each {|x| ...}からary.each->(x=1){...}にすると、x=1がeachの呼び出し前に実行されるような錯覚に陥りません?あと、do...end はどうなるんでしょう。
個人的には、|...|を<...>や<|...|>のように対応関係がつく文字(列)に変更するのが好きです。

取りすがりさん:
Prologは:-ですね:P

_ まつもと (2005-07-24 23:13)

引数がブロックの外に出ることについてはじきに慣れると思います。
あと、今までの例では ->(x){...} と書いていますが、{...}の部分は当然 do ... endで置き換えられます。

最後に|...|を「なにか」に変更するアイディアですが、これが結構難しくてですね。オプショナル引数を扱えるためには閉じる記号として式の一部として登場する記号は使えないし(だから > はダメ)、|>のような長いのも好みではありません。なんか良いアイディアはないかなあ。

やっぱ、lambdaを予約語化するのかなあ(そんなに乗り気じゃない)。

_ Akela (2005-07-25 10:12)

f()はどうでしょうか?

proc = f(x, y) { ... }

_ ma2 (2005-07-25 12:31)

->を逆向きにして<-とか<=はどうでしょう。
proc = <-(x,y) {...}
分かりにくいかな...
proc <= (x,y) {...}
とか書けるといいのかなー。

_ なかだ (2005-07-25 14:25)

その二つは比較と区別がつきませんから。

_ なかだ (2005-07-25 15:16)

引数がブロックの外に出なければ、割と自由に開始記号を決められるような気がするんですが。
{->(x,y) ...}
{<-(x,y) ...}
{<=(x, y) ...}
{=>(x, y) ...}
{<(x, y) ...}
{=(x, y) ...}
{>(x, y) ...}

_ 通りすがり (2005-07-25 19:54)

しかし、こうやって変な記号を導入してゆくと、どんどんperlと同じようなヨゴレ言語になってゆく予感。

_ Jon (2005-07-25 23:45)

デフォルト引数を書いたら最後にカンマを書かなければならないようにする、というのはどうでしょうか。

{|x,y=5|10,| ...}

_ n_ryota (2005-07-26 01:47)

λ に似せて >. とか >, とか。冗談です…(問題解決してないし)。

_ すがり (2005-07-27 12:37)

>* 引数リストに前置する
という条件をまげて、「引数リストに後置で構文解析をがんばる」という選択肢は無理ですか?

_ まつもと (2005-07-27 15:50)

yaccでは無理ですね。先読みが1しかないから。
無限先読みができるコンパイラ・コンパイラを使うか、手書きの構文解析器に変更すれば不可能ではないですが、そのコストに見合うほどの選択肢ではないように思います。

お名前:
E-mail:
コメント:
本日のリンク元
アンテナ
検索

RSS feed meter for http://www.rubyist.net/~matz/ Creative Commons License This work is licensed under a Creative Commons License.