ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

プログラミング言語 FORTHコミュのFORTHにラムダ式を導入するには?

  • mixiチェック
  • このエントリーをはてなブックマークに追加
皆さん(私を含めて)FORTHにラムダ式を入れられないかというチャレンジをされているようなので、別個にトピック作りました。

FORTHにラムダ式を入れるにあたって、以下のような問題がある。

第一に、ラムダ式に与えられるパラメータの数を特定できないこと。
第二に、ラムダ式自体をパラメータとして与える方法がないこと。同列に、パラメータが不足している場合、結果がラムダ式になるが、この場合のラムダ式を置く方法がないこと。

さてさて、如何に実現するか?
アイデア募集!

コメント(21)

FORTHオフ会で出たアイデアとしては、

第一の問題でまさにLISPのように括弧で括る事。
言うなれば「逆S式」とでも言うべきか。

例)( 2 4 lambda-expr )

括弧はもちろんFORTH「ワード」で、スタックデータをブロック化する機能を有する。これにより、ワードに与えるパラメータの最大値を示すことができる。
考えてみれば "(",")"は注釈で利用されているから、別の記号を使わなきゃいけないか。
> 同列に、パラメータが不足している場合、結果がラムダ式になるが

変数を導入したら自由変数とそうでないのが判断できるので、それで終り!…と思っていたけど、そうか、カリー化があったか…。

カッコの導入は必須かもしれないですね〜。
Mindでは[]で括ると中置記法の算術式が書けました。
記号としてのlambdaは必ずしも必要ではなくて、
[]の中に定義本体が書ければ良いのかも。
http://karetta.jp/blog/karetta-dev
4: yasuyukiさん>記号としてのlambdaは必ずしも必要ではなくて、

そのとおりです。
実はあえて深く掘り下げて書かなかったのですが…。
#時間が無かったともいうw。

実はこの括弧、単にS式のためというより、むしろロジックのブロック化(ブロック内のワードが利用できるスタックの深さの制限)のためにあると言ったほうが正確なのです。

結果としてS式のためにも利用できると。

で、ローカル変数の制御にも関与できるかも。とか考えてたりします。
もちょっと検討の余地がありますけどね。
[]で括るのではなく、:と;の間がλだ、ということにしてしまうとか。:定義の名前のところに名前ではなく "lambda" と書くとか。

: lambda body ;

または lambda: body ; とか。

(やはりイマイチな気がします...)
7: yasuyukiさん>:定義の名前のところに名前ではなく"lambda" と書くとか。

コロンの後ろは定義するワード名なので、さすがにこれは難しいかな。

LISPとは違い、自動的に式を評価(eval)するわけではないだろうから、ワード「eval」でも定義して…、

括弧の「[」「]」もすでに標準定義済みのワードだから、とりあえず、「[[」「]]」を使用すると想定して…、

[[ 2 3 lambda-expr eval ]]

などとするように考えてみる。

ワード「eval」はスタックに積まれたlambda-exprを評価し、l結果をスタックに積む。結果は場合によっては再びラムダになる場合もある。

とすると、lambda-exprは動的に獲得されるメモリ領域におかれる「オブジェクト」にならざるを得ない。

むむむ。やはり動的なメモリ管理は必須だなぁ。


7: yasuyukiさんのアイデアを少し変形させて、

:lambda expr-name body ... ;

とする「:lambda」定義では、ワード名「expr-name」が呼ばれると、メモリ空間から適切なサイズのメモリ領域を獲得して、適切なデータ(式)を設定し、その領域へのポインタをスタックに積む。ということになるか。

どこからも参照されなくなったらヤバイのでGCも必要だなぁ。
はてさて、ワード「eval」はどのような挙動を示すのか…。
そういやLISPはevalがキモだよなぁ。

#やはりワード「eval」の実装が鍵かなぁ。
redditで上位に来ていたこの記事。

ttp://gikoforth.s13.xrea.com/td/?date=20061003

Joy面白そうですね。
みてみました〜。
まだちゃんと読んでないのですが、なかなか面白そうです。

Lisp/Scheme には無い利点があると良いのですけどね〜。
ざっと見ただけなので、良く分かってないですが(汗
> そもそも Forth にラムダ式を

Lisp は全てがデータである。プログラム=データ。
一方、Forth は全てがプログラムである。変数ですらプログラムである。

ゆえに、Forth と Lisp は表裏一体。

Lisp にあるものは Forth にもあるべし。


…という信仰が存在するのかどうか、僕には分かりませんが(笑

Forth と Lisp は対極にあるような気がします。でも、この2つの奇妙な言語はもっとも離れた場所にあるが故に背中合わせの位置にあるような気がしてます(根拠なし)。



人はなぜ Forth にλを求めるのか?
それは Lisp にλがあるからさ。
プログラム≒word でOKです。


> スタックのトップにあるラムダ式を必ず WHNF まで
> 評価するような Forth の言語拡張

ありだと思います。僕もそんな風に考えていたのですが…

以下、挫折の記録などを(笑

このように Forth にλ式を導入すると、λ式を 1st class object というかプリミティブというか、として扱いたくなってきます。変数にも代入したい。
となると、やはり動的なメモリを確保してそこへのポインタを持つのが良さそうだ−って事になるように思います。

まさに8の masamic さんの意見と同じです(じょ、情報量ゼロだ…orz)

さらに言うと、λが入るならクロージャも欲しい。
何故 Forth にクロージャを入れたくなるかというと、それは Scheme に(以下略)

で、この辺りで挫折。
今振り返って考えてみると、λにおける変数の導入に失敗したのが原因のように感じます。


あと、いろいろやっていくうちに、新たに組み入れるλ計算用の評価系=これって、Scheme なのでは…という状況になってしまい、それなら素直に Scheme 使ってた方が良いよな…orz という状況になりフェードアウト。


件の論文はそのあたりをちゃんとやっているっっぽいので、もしかしたら、いろいろな可能性を秘めているのではないかと思っています。


頭の良い人が考えたら、スカッとした実装ができるような気がするんですけどね〜。
> 8 と 17

うーん、どうなんでしょう。masamic さんも、結果は再びλになるとか、オブジェクトなどとおっしゃられておられますので、多分、1st class object として考えられているような気がしております。

このあたりは masamic さんにご登場願いたいのですが…。
encafe 方面にいらっしゃるのかな?
だれか召喚していただけると嬉しいです(笑
# FOX のインプリメンタだし、僕なんかよりも、
# はるかに多くの事を語っていただけると思います。


> 一方、ラムダ計算では通常"明示的な"データ渡しを
> 行っています。個人的にはこれは大きな違いだと
> 思うのですが…

そうです、そうです。
この辺りも考えないといけないと思います。
括弧を使うのか、それとも、何個の変数をバインドするのか、といったカリー化ワードなどを用意するのか、etc。

どちらにせよ、パッとした方法じゃない感じがしてます。

それに括弧だらけの Lisp と、括弧が要らない Forth ってのも、表裏一体な感じがある(ありますよね?)ので、括弧の導入はできれば避けたい気がします。


何か良い方法を思いつければいいのですけど、なかなかアイデアが出ないです(苦笑
ご参考までに。

The Cat Programming Language

http://www.cat-language.com/
http://code.google.com/p/cat-language/

ログインすると、残り5件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

プログラミング言語 FORTH 更新情報

プログラミング言語 FORTHのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。