Lastpost: 2019年05月04日(土) 17時30分JST-9 qushgu

Airemix Mireille Board System

■■■■■■■

- 記事返信モード -

このスレッドの今までの内容

2004年のよしなごと

【No.244】 成瀬ゆい 【HOME】 2004年01月10日(土) 23時54分JST-9 【修正】
[ GDqzJTJswmI ]
たまには雑談スレッドでも立ててみようかな。

先日本を買ったんです。
一冊は野中広務さんの「老兵は死なず」で、もう一冊が「光速より速い光」。

野中さんはファンだったので引退を知ったときはなかなかにショックでした。
あの悪そうな顔が中学時代の担任を思い出させて懐かしかったんですけどねぇ〜。
本の内容としては、特別「おぉっ」と驚くような話はさほどありませんでした。
小渕さんが倒れたときの話を始めとして、含みのあるような部分は結構あったので、誰かが注釈をつけてくれるとよいのですけど。
この本では小泉さんが実は大蔵系の人間だと指摘しているのですが・・・わたしはたぶん日銀系だと思う。
ちなみに、野中さんは郵政族だと思っていたのですが、国鉄上がりだったんですね。

しかし、最近の日本のナショナリズムの高まりと安全保障の方針は恐ろしいものが、、
西欧はナショナリズムを捨てて統合に動き、東欧や中東はナショナリズムで混乱している今、なにを考えているのやら。。
だいたいだから前から日本の自衛隊は6割が軍事オタで(以下ただの非難なので略

で、光速より速い光ですが〜、まだ読んでません。
実際どうなってるんです?
教えてエロイ人っ!

###
そうそう、珍しく音楽CDも買ったんです。
1万枚限定らしくて、行った所ではすでに売り切れだったので秋葉原まで行く羽目になりました。
しかしさすが石丸電気ですな、でっかいなーでっかいなーいしまるっ♪
さくっとでてきましたよ。
ちなみに買ったのはBen FoldsのSpeed Graphicというもの。
トラック1のIn between daysに惚れました。
聞きたい方は(以下略
そうそう買ったらラストエグザイルのポスターをもらえたですよ、うらやましいでしょw>某氏

あと、Natural highの愛カタリも買おうかな〜と思っていたのです。
で、CDを探してみたら・・・レーベルゲートCD。
買おうという話しは無かったことになりましたとさ。
バックで鳴ってるピアノは気に入ったんだけどねぇ。

###
あ、そういえば、うちのPGP鍵の期限が切れちゃったので更新お願いします。
内容は同じですが鍵の期限を2003-12-31からNeverに変えました。
wwwkeys.uk.pgp.netやpgp.nic.ad.jpのようなkeyserverで入手できますので欲しい方は適当に。
keyserverによってはまだ新しいものに置き換わってないかもしれませんので、
まだ古いものだった場合はちょっと待ってくださいな。
  【Re:1】 ボヤッキー 2004年01月13日(火) 08時44分JST-9 【修正】
[ sbkSeeISCU. ]
この前成ちゃんの鍵探してたら失効してて、聞いてみようかと思ってたところでふ。
Fingerprintは
DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA
ですね? Signして放流しておきますか?
____
FWのログ見てると、最近Pingかなり減りましたね。
一時は数十秒おきに来たんですが。

今年はTOP絵がすぐに替わりましたね(w クリスマスの絵も気に入ってたんですが。
  【Re:2】 成瀬ゆい 【HOME】 2004年01月14日(水) 23時03分JST-9 【修正】
[ GDqzJTJswmI ]
気づいたらいつの間にか期限切れになってたんですよね〜(汗
Fingerprintはそれです〜。
Signよろしくですw
うちからもSignしときますね〜。

ふむ、Ping減りましたか。
世間でもping攻撃への耐性が上がってきたからなのですかねぇ。

クリスマス絵は一週間程度で正月絵に変わっちゃうんですよね〜。
ここ二年は正月絵は夏ごろまで変わらないのですけど(w
過去にうちのTOPだった絵は基本的にTAKE4さんのなので、
http://t-file.cside.com/に行けばありますよ;)
#あのクリスマス絵えちぃですよね(ぉ

そういえば、また別の本読んでいて見たのですが、
近代の築城理論では地上と地下が一体で行われる・・・
というか、むしろ地下の方がメインって話はホントですか?
東京の地下に江戸時代から現代までの地下道が縦横無尽に走っているという話を聞いて、
地震の時うちが陥没しないかとちょっと怖いのですが(==

そんなわけで、
石破防衛庁長官軍事ヲタ説を裏付ける確かな証言を得て機嫌のよい成瀬でした(何
  【Re:3】 和歌ぽん 2004年01月15日(木) 23時56分JST-9 【修正】
[ iAKtEEMbYSQ ]
>教えてエロイ人っ!
呼んだー?(呼んでない

そうそう、なるちょって今受験生・・・だっけ?
  【Re:4】 牛鍋 【HOME】 2004年01月17日(土) 16時52分JST-9 【修正】
[ jGuK1sZBcXI ]
ども〜w
久々のカキコですw
前前に(かなり前)に言っていたのですが、やっとうちのHPにリンク追加しましたー(遅
よろしくお願いです(ぇ
  【Re:5】 成瀬ゆい 【HOME】 2004年01月17日(土) 23時01分JST-9 【修正】
[ GDqzJTJswmI ]
呼びましたーっ
VSLのバリエーションのうち一部ではワープができるかもって話が書いてあったんですが、
今世間一般ではこのあたりどんな見解になってるんですか〜?
ブラックホール系の人の関係者な友人に聞いたら話がかみ合わなかったので、結局良くわからなかったのです(ぉぃ
光速が場合によって変わるってのはすでに一般的な考えになっているような感じでしたけれど。

えー、年齢とか性別とか個人情報系についてはノーコメントでー
時々口を滑らすことはありますが、基本的に秘密主義なのです。
まぁ普通の戦場のメリークリスマスを聞くとテンポが遅いなぁと感じる人ですから。
やっぱり戦場のメリークリスマスは二倍速でないとね(謎
そういえば某官房長官の館の人は結局どうなったのでしょう?(意味不明
ネット世界にどういうルートから入ったかというのは、
その後の人生にかなり大きな影響があるのではないかと思ったりする今日この頃。

#めも
「オープンソースは下町気質」
http://nnri.dip.jp/~yf/cgi-bin/yaswiki.cgi?name=%a5%aa%a1%bc%a5%d7%a5%f3%a5%bd%a1%bc%a5%b9%a4%cf%b2%bc%c4%ae%b5%a4%bc%c1
確かにそう言われてみれば、と。

え、リンクの話なんてありましたっけ(マテ
えーっと、とりあえずサイトのコメントを50字程度でくださいな〜。
  【Re:6】 牛鍋 【HOME】 2004年01月19日(月) 00時53分JST-9 【修正】
[ jGuK1sZBcXI ]
サイトのコメント・・・(、、
『なんだか大きな野望を持っているサイトのようです』ということで(ぇ
  【Re:7】 和歌ぽん 2004年01月21日(水) 04時19分JST-9 【修正】
[ iAKtEEMbYSQ ]
>今世間一般ではこのあたりどんな見解になってるんですか〜?
私はただのエロい人なので質問にはお答えできませんっ(威張り
「光速より速い光」、読んでませんしね(ぉぃ
でも光速が一定であるかそうでないかというのはかなり昔に友人と論争かましましたねえ。
当時はトンデモ話として片付けられたような記憶が。
#門前の小僧同士でゴタク争い。不毛過ぎw
#タイムマシンか何かの話だったかなあ?

>年齢とか性別とか個人情報系についてはノーコメントでー
ああ、ちょっと配慮が足りなかったですな。そーりー。
最近なるちょ見かけないなあ、と思ったので。やはは。

>東京の地下に〜
東京の地下と言えばこの本も面白そうデスな。
http://www.amazon.co.jp/exec/obidos/ASIN/4896916808/249-9610774-6727547

#おまけ 「インターネットを、もっとも標高が高いところでするにはどこに行けば良いでしょうか。」
http://www.hatena.ne.jp/1074543112
  【Re:8】 成瀬ゆい 【HOME】 2004年01月21日(水) 23時25分JST-9 【修正】
[ GDqzJTJswmI ]
>牛鍋さん
んにんに、リンクしましたですよ〜。
確認してくださいな〜。

>わかさん
素人考えだけれど、タイムテレビならともかく、タイムマシンは無理だと思うんだよねぇ。

最近出没率が下がっているのはメインの活動場所が移ったのと、
登場する掲示板の範囲を広げすぎて、掲示板への書き込みだけで手一杯になっているからかなぁ。

> 東京の地下と言えばこの本も面白そうデスな。
ふふり、それは約一年前に読みました(w
ってか、最近読んだやつは、その‘2’なのですよ。
著者のサイト http://homepage3.nifty.com/norikoakiba/
前の作品にディレクターズカット、書評は何度か見たものの実際には読みませんでした。
「テレビ朝日に勤めていた頃、警察に職務質問を受け、麻薬所持で逮捕」、
なんて話が上のサイトからリンクされている日記の一つに載ってました。

とりあえずわたすが別ルートで確認した情報を以下に。

営団地下鉄に公開されていないバイパス路線が数多くあるのは確かです。
南北線が開通するときだったかに、日テレ系所さんの目がテンでやっていました。
路線によっては形式が違うので乗り入れできないものもありますけれど。

霞ヶ関には地下車庫がありますね。
日比谷線に乗って外を見ていると霞ヶ関で車庫が見れます。

南北線王子神谷の車両基地はわたしも開業前に行きました(w

南北線永田町は明らかにヘン、ホームの中心にずーっと壁が走ってます。
壁の内側はどうなってるんだろ・・・。

大手町のあたりは地下道が凄いんだよねぇ。
大手町から東京駅まで地下道で行けるってのはあまり知られていないんじゃなかろか。
秘密というわけではないけれど、あまり知られていない乗換え方法(すなわち地下道)ってのは結構あるのです。

そういえば、ダイヤモンドアプリコットの山崎はるかさんのコラムに、
地図には色々秘密があるって話を示唆するようなことが書いてあったような・・・。
こんど見直してみよう。。。

> 「インターネットを、もっとも標高が高いところでするにはどこに行けば良いでしょうか。」
おもしろいねぇ(笑
ふと、m43さんの語り口が、「タイムマシン(本物)」をYahooオークションに出品した人に似ているな、
と思ったのはわたしだけかな。。。
「できればmacを持っていって、『チョモランマック』という駄洒落を完成させたいのですが、、」
みたいに妙な所で笑いを取ろうとしているのや、情報を小出しにするのとか。
  【Re:9】 午後の紅茶b 2004年01月22日(木) 00時50分JST-9 【修正】
[ rRvmEHBZLrw ]
>大手町から東京駅まで地下道で

以前、逆方向に歩きましたが。
赤坂に行くのにそうしたんだっけか。

> 「インターネット

極寒の元で使えるコンピュータ、衛星経由で通信できる手段、気力、体力を持ってネパールかどっかへ、、て同じ事書いてあるな
  【Re:10】 牛鍋 2004年01月23日(金) 13時48分JST-9 【修正】
[ jGuK1sZBcXI ]
>成瀬様
確認いたしましたー。
ありがとうございましたw
  【Re:11】 成瀬ゆい 【HOME】 2004年01月25日(日) 00時10分JST-9 【修正】
[ GDqzJTJswmI ]
=Bさん=
> 以前、逆方向に歩きましたが。
おぉ、使ったことありますか。
やっぱり知っている人は知ってるのかな〜。

> 極寒の元で使えるコンピュータ、衛星経由で通信できる手段、気力、体力を持ってネパールかどっかへ、、て同じ事書いてあるな
まぁ、地球上だったらとりあえずエベレストになりますね。
その先はやっぱり綺堂軌道エレベータだ(><

=牛鍋さん=
そういえばリンク追加って久しぶりだなぁとか思ったり(ぉ

###
某Matz日記http://www.rubyist.net/~matz/で見て感銘を受けました。
http://sumim.no-ip.com:8080/wiki/493
http://sumim.no-ip.com:8080/wiki/500
プロトタイプベースオブジェクト指向とクラスベースオブジェクト指向なんてものがあったのですね。

で、これを見て気づいたことが三つ。
== これまでに見たオブジェクト指向の本
全てクラスベースオブジェクト指向について解説していたのですね。
どおりで隠蔽やポリモーフィズムのような、非オブジェクト指向Perlでもやっていたようなことがメインになっていたわけだ。

== UMLについて感じていた疑問
UMLにはクラス図がありますが、インスタンス図がない。
クラス中心に考えていたからだったのね。

== 今までの自分のオブジェクト指向観
自分はどちらかというとインスタンスベースオブジェクト指向(プロトタイプベース)よりの考えをしていたようです。
実世界の中で暴れまわるのはクラスでなくインスタンスなわけで、
インスタンスが主役なのが当たり前だと思っていたのですが、世間一般ではそうでもなかったんですね。

そんなこんなでRubyでMireille2の記事操作部分のデザインをしたりしてみたり。
  【Re:12】 くろ@ぱおん 2004年01月25日(日) 01時14分JST-9 【修正】
[ .pG3l.TBsTQ ]
>もう一冊が「光速より速い光」。
そうそう私もこれ読んでますよ〜(別スレッドから話題を引っ張ってきたw)
そして、忙しい(嘘)から途中までしか読んでないのだ・・・

==おぶじぇくと指向とか
しむらとか、すもーるとーくえいてぃーとか・・・
熱く語っている非常勤の先生(本とか書いてるらしいけど聞いたこと無い)がいますが、
ほとんど寝てて聞いてないや〜w
プロトタイプベースオブジェクト指向とかの言葉は初めて聞きました。
プロトタイプベースってのは未知の世界なのでこんどやってみるね〜

それと、実世界で暴れまわっているのは電子なわけで、インスタンスじゃありません(ぉぃ
概念の問題。暴れまわっているのが主役ってわけじゃないですぞい
  【Re:13】 成瀬ゆい 【HOME】 2004年01月26日(月) 02時20分JST-9 【修正】
[ GDqzJTJswmI ]
== 「光速より速い光」
にしし、わたしはもう読み終わりましたよw
なんか後半に行くにつれて、まだ研究中〜感が漂って来て、よくわからなくなってきますな(ぉ

== おぶじぇくと指向とか
言語マニアっていますよねぇ。
わたしも多少そのケがなくは有りませんが(笑
D言語ってのをやってみたいと思っているのだけれど、まともに取り掛かれるのはもっと先になるかなぁ・・・。

電子は、イデア界にある電子クラスのインスタンスでしょ?
ってか、コンピュータに限った話でなく、もっと一般的な話なので。
オブジェクト指向というのはプログラミングスタイルに限らず、
世界の記述方法の一つだと思っているのです。(おおげさ
それだけ大きな概念だから、人それぞれでオブジェクト指向観が違うんでしょう、きっと。
  【Re:14】 名無しさん 【HOME】 2004年01月26日(月) 17時19分JST-9 【修正】
[ OfHRIMUBLHw ]
そんなわけでお久しぶりです(ぇ
  【Re:15】 成瀬ゆい 【HOME】 2004年01月27日(火) 22時52分JST-9 【修正】
[ GDqzJTJswmI ]
あら、おひさしぶりです〜。

また名前変えたんですね(==
ってか名前が某さっきーさんとまぎらわしいし(ぉ

そういえば、MEG-OSってどうなったんですかー?
  【Re:16】 くろ@ぱおん 2004年01月27日(火) 23時19分JST-9 【修正】
[ .pG3l.TBsTQ ]
==言語マニア
CとC++しかやったことない・・・w
噛む程度なら、SQL・・・・プログラミング言語じゃ無い _| ̄|○
そんな程度です情報学科の学生は。

マニアなあなたにお勧めの本はコチラ 『コードコンプリート』! 
http://www.amazon.co.jp/exec/obidos/ASIN/4756102107/250-0918794-3134624
面白いらしいです(私は未読、というか読む予定すらない)

追記:
オブジェクト指向大好きな担任の助教授は、『是非、原著で』とよく言う。
『言葉が理解できなくても雰囲気で理解』と、研究室の学生を英語の公演に連れて行く。
まったくやる気のない学生に『フィーリングで理解』とかいって、英語の論文を渡す。
ミステリアスな人だ。


==イデア界&世界の記述方法の一つ
イデア? 世界の記述? 最高ですか〜!?w
世界の記述は是非、偏微分微分方程式で。


==追記
風呂入ってるときに思い出した。
イデアって、プラトンとかの時代の哲学用語?(今もそうだと思うけど)
確かにあの考え方はオブジェクト指向ですね
でもプログラムの世界のオブジェクト指向は、
人間の処理能力の低さから来たって感じがして別物って感じ(これが個人による見解相違か)
  【Re:17】 名無しさん 【HOME】 2004年01月28日(水) 12時59分JST-9 【修正】
[ OfHRIMUBLHw ]
>ってか名前が某さっきーさんとまぎらわしいし(ぉ
(あせあせ

>そういえば、MEG-OSってどうなったんですかー?
どうなったんだろう。。。(ぉ
  【Re:18】 成瀬ゆい 【HOME】 2004年01月29日(木) 11時24分JST-9 【修正】
[ GDqzJTJswmI ]
> マニアなあなたにお勧めの本はコチラ 『コードコンプリート』! 
ふーむ、今度立ち読みしてみます(w

> オブジェクト指向大好きな担任の助教授は、『是非、原著で』とよく言う。
んー、まぁたしかに原著で読んだ方が良いとは思いますが〜ねぇ。

> 世界の記述は是非、偏微分微分方程式で。
偏微分方程式は当分無理です(w

> イデアって、プラトンとかの時代の哲学用語?(今もそうだと思うけど)
そです〜。
影絵の紙?がクラスで、壁に映った影がインスタンスですね。
そもそも、オブジェクト指向のルーツは哲学だー、とか聞いたことがあります。

> 人間の処理能力の低さから来たって感じがして別物って感じ(これが個人による見解相違か)
そういう面もたしかにありますね。
Win32APIのようなフラットなものだと限界がありますからねぇ。。
よくありがちな、数学用の関数や定数をMathモジュールに集めている、とかはそういう面が大きいかも。

けれど、そもそも人間の考え方はオブジェクト指向なので(MacのUIはそういう理念で作ったらしい)、
言語はオブジェクト指向であるのが本来だが、今まではコンピュータに合わせて手続き型にしていた、
という考え方もあるのですよ。

コンピュータ的にも、ある程度大規模なプログラムになると、モジュール間の関係の数が増え、テストが難しくなるので、
オブジェクト指向を使って最小単位を大きくし、それによってテストを楽にしよう、ってのもあるようです。
人月の神話の復刻版に載ってた論文では、オブジェクト指向のそうした側面を指摘してました。

> > そういえば、MEG-OSってどうなったんですかー?
> どうなったんだろう。。。(ぉ
ちょっとちょtt、、
せっかくZaurusでPC98エミュレータが動くようになったらしいから試してみようと思ったのにー
  【Re:19】 eclipse 【HOME】 2004年02月01日(日) 10時58分JST-9 【修正】
[ 2adF0rWtCng ]
はじめまして、eclipseといいます。

私もオブジェクト指向言語においてクラスは無い方が綺麗だと思いますね。
プロトタイプベースに興味持ってる人はけっこういるようです。
でも実際に使ってる人となると・・・めったにいないんじゃないですかねぇ。
趣味程度なんじゃないかな。
まぁこれからじわじわと支持層を増やしていくような気がしてます。
オブジェクト指向が廃れて関数型がメジャーになるんでは、という意見の人もいますが、それはまずないと思いますね。
関数型は要求頭脳スペックが高過ぎます。世のプログラマの大半は普通の人ですからw

知ってるかもしれないけど、プロトタイプベースについてはこんなスレッドがあります。
http://pc2.2ch.net/test/read.cgi/tech/1070886635/
  【Re:20】 成瀬ゆい 【HOME】 2004年02月02日(月) 02時14分JST-9 【修正】
[ GDqzJTJswmI ]
はじめまして〜。
世界の果てで戯言を叫んでる掲示板へようこそ☆
こんな僻地にどこからいらっしゃったのでしょうか。

知ってからいろいろ考えてみたのですが、わたしはクラスはやっぱりあった方が便利だと思うのですよ。
ただ、今のクラスはいろいろなものを詰め込みすぎていて、何をやっているのかわかりにくいな〜と。

今思いついたクラスの役割を挙げると、
* namespaceっぽいもの
* prototypeっぽいもの(インスタンスの設計・記述)
* Factoryっぽいもの(そのクラスのインスタンスを管理)
* 型っぽいもの
くらいでしょうか。

わたしの少ないプロトタイプベースオブジェクト指向言語経験(=JavaScript経験)で感じたのは、
* (これはプロトタイプベースの本質的な欠点ではないけれど)関数の名前空間がフラットなので頭がパンクする。
* 記述がだるい

obj.prototype.method = function(i,j){
var k = i + j;
return k;
}

とか書くのはなんかアレで、、、
#いや、ケースによってはこういう記述もできたほうが便利。
#ただ、こうしか書けないのは不便。

namespaceは必ずしもクラスでやらなくてもいいでしょうし、
型っぽいものの役割はhasFeature()とかで見るようにすべきなんでしょうね。

Selfとかは知らないから今度見てみないとな〜とか思っています。

> プロトタイプベースについてはこんなスレッドがあります。
2ちゃんねるは人から紹介されたスレッド以外見ていないので初見です。
なかなか、参考になりますね〜。
特に148,149の話は興味深い。
「外身を変えずに中身を変える」という意味のRefactoringだったら、Mireilleでやっているのですが、
静的な言語で変化をもたらすための手法だというのは。

> オブジェクト指向が廃れて関数型がメジャーになるんでは、という意見の人もいますが、それはまずないと思いますね。
ないでしょうねぇ〜。
OCamlをちょっと触ったことしかないのですが、なんか計算のためのものってイメージがしてます。
関数型言語で掲示板組むのとか考えられません(w
#掲示板は副作用のある処理が多いですし。
オブジェクト指向言語が関数型言語の影響を受けて変わっていくことはあるでしょうけれどねぇ。
Rubyとかでカリー化ができたら、使い方によってはおもしろそうですし。

ついでに、eclipseさんのところの日記で面白そうだった所にツッコミ。
> i18n,m17n
Unicodeに対応したらi18n、日本語のメッセージがでるようになってもi18n、
日本語特有の処理(禁則とか)や、encodingによって処理が変わったりするとm18nってイメージが(ぉ

> 多引数関数の可読性を上げる
ハッシュで渡すのとかはどうなんでしょ。
Mireilleでは
sub hoe{
my%data = %{shift()};
print "aa => $data{aa}, bb => $data{bb}";
}
my%data=(aa=>1,bb=>2);
hoe(\%data);
なんて処理をしていました。

「メソッドの引数渡し = メソッドのオーバーライド」というのは、
関数型言語にある「カリー化」にちょっと似てますね。
オーバーライドまでしてしまうというのは、またおもしろいです。

ところで、lambdaは長いとのことですが、procじゃダメなんですか?
Rubyではlambdaとprocは同義なのですが〜。

光田さんよいですよね〜。
ChronoCrossのサントラ買ってきて聞いた時はもうなんかわーいって(何
って、ZABADAKですかーw
光降る朝は持ってないんですよねぇ〜。
太りすぎさんにaMU'さん経由で教えてもらって以来かなり好きです〜。
Xenosagaで一部の曲に吉良さんが演奏しているのは豆知識。
  【Re:21】 eclipse 【HOME】 2004年02月02日(月) 20時31分JST-9 【修正】
[ 2adF0rWtCng ]

> こんな僻地にどこからいらっしゃったのでしょうか。
「プロトタイプベース UML」とかググってたら…w

クラスあった方がいいですか…うーん.
結局クラスって制限ですよね.
クラスというオブジェクトにだけ持つことができる機能,
クラスというオブジェクトには持つことができない機能.
そうやってはっきりとした線引きをすることによるメリットは確かにたくさんありますね.
安全性,効率,静的解析 etc.
でも,私としてはクラスオブジェクトのようなものは標準ライブラリにあればいいなと.
使いたければ使えばいいし,使いたくなきゃ自分でクラス相当のものを作れるという感じで,
可能な限りプログラマが自由に遊べる空間がいいなぁ.
制限がある世界から制限を取り除くのは難しいけど,
制限がない世界に制限を加えるのは比較的簡単だと思うわけです.

まぁこんなのは単なる言語ヲタの戯言ですがw
企業とかで大規模な開発するときにプロトタイプベースがいいとは思いませんね.
それでもこれからもっと認められてくると信じてますよ.
テスト駆動開発等の方法論によって動的な言語でも安全なプログラムが作りやすくなったし,
最近はソフトウェアの性能(速度とかメモリ消費量)ってあまり評価されなくなりましたよね.
それよりも如何に速く完成させるかという風潮ですから.

>* (これはプロトタイプベースの本質的な欠点ではないけれど)関数の名前空間がフラットなので頭がパンクする。
マジですか… それは嫌だなぁ
JavaScriptは昨日初めたばっかなんですが,けっこう良さそうだっただけに残念.
クロージャが普通の関数と同じように書けたり.

>Selfとかは知らないから今度見てみないとな〜とか思っています。
Selfは触っときたいですね.言語ヲタとしてはw
ただ日本語の資料が無い.ホント無い…

>ハッシュで渡すのとかはどうなんでしょ。
構造体にしてもハッシュにしても内部的にはオブジェクトですよね.
私のとこの一時引数オブジェクトって書いてあるやつ.
Perlでやるには最善策かもしれませんね.Perlほとんど知らないけどw

>「メソッドの引数渡し = メソッドのオーバーライド」というのは、
>関数型言語にある「カリー化」にちょっと似てますね。
抽象的な関数を徐々に特定化していくというとこは確かにその通りですね.
気付かなかったです.
俺言語(笑)ではクラスからインスタンスを生成するということを,
オブジェクトのオーバーライドで表現しているんです.
それと同様に関数の引数渡しもオーバーライドで表現できると統一されていいなぁと.

>ところで、lambdaは長いとのことですが、procじゃダメなんですか?
>Rubyではlambdaとprocは同義なのですが〜。
忘れてましたw procだと2文字短いですね.
lambdaの方がかっこいいからlambda使ってたんだけどw

>光田さんよいですよね〜。
>ChronoCrossのサントラ買ってきて聞いた時はもうなんかわーいって(何
いいです! 凄くいいです! (上手い形容が見つからないw)

>Xenosagaで一部の曲に吉良さんが演奏しているのは豆知識。
へぇ〜
で,「吉良 Zabadak Xenosaga」でググったらまたここがヒットしましたよw
ビビった.1年前くらいですねぇ.
  【Re:22】 成瀬ゆい 【HOME】 2004年02月03日(火) 22時38分JST-9 【修正】
[ GDqzJTJswmI ]
> 「プロトタイプベース UML」とかググってたら…w
あら、そんなキーワードでヒットするようになっていたんですねw

> 結局クラスって制限ですよね.
そこが、プロトタイプベースな考え方によくある欠点の一つだと思うのですよ。
わたしにはクラス=静的なもの=制限というイメージはあまりないんです。
むしろ名前空間を分けるためのもの、記述をすっきりさせるためのもの、というイメージですね。
C++やJavaの方はクラスを型として使うことがあると、知ってはいますが感覚とは結びついてない〜と。

これは多分、わたしがJavaScriptで、
if(str.aIEMethod){ // IE独自実装があるかどうか調べて、
str.aIEMethod; //あればIE独自実装を使った処理
}else{
str.aStandardMethod; //なければ一般的な実装で処理
}

なーんてことを何度もやっていたからだと思うのですが、。
型よりも実際にそのメソッドがあるかどうかで判断する、と。

> 使いたければ使えばいいし,使いたくなきゃ自分でクラス相当のものを作れるという感じで,
結局それですよね。
一つの言語でプロトタイプベースにもクラスベースにも書ければ何も言うことはないです。
JavaScriptなんかはその点、なんでもありという点でおもしろいですね。
eclipseさんの日記に載っていなかった両極端の二例を挙げますと、

== プロトタイプベース
var com = new Object;
com.x = 1;
com.y = 2;
com.display = function(){return this.x+"+"+this.y+"i";}
com.display(); //=>"1+2i"


== クラスベース
class ComplexC{
  var x,y;
  function ComplexC(x,y){
    this.x=x;
    this.y=y;
  }
  function display(){return this.x+"+"+this.y+"i";}
}
var com = new ComplexC(1,2);
com.display(); //=>"1+2i"


JScript.NET/JavaScript2/ECMAScript4ではクラスも本格的に導入されたので、もうなんでもありですな(笑

> 企業とかで大規模な開発するときにプロトタイプベースがいいとは思いませんね.
この話はプロトタイプベースの推進派の方も謙遜してよくおっしゃるのですが、実際の所どうなんでしょう。
大規模な開発をクラスベースで慎重に行っても、バグは何個も出るわけです。
悪い時には実稼動時に致命的なバグがみつかってしまうこともあり、
その場合は一刻も早く、とりあえず動く状態に復旧しなければならない。
そんなときのことを考えると、大規模なシステム開発でもプロトタイプベースで行うメリットはあるかな〜と。
普段は、自由度の高い言語を厳格なガイドラインの下で使い、いざというときは自由度をフルに生かす、ような。
まぁ、卓上の空論ですけどね^^;;

> 関数の名前空間がフラットなので頭がパンクする。
Win32APIはごちゃごちゃしている、WinFXでは階層構造になってすっきり、と同じ話だったのですが・・・、
すみません、改めて考えてみたら思いっきりウソです(死
プロトタイプベースでも、
var level1 = new Object;
level1.method1 = function(i){return i}
var level2 = new Object(level1);
level2.method2 = function(i,j){return i+j}
var level3 = new Object(level2);
level3.method3 = function(i,j,k){return i+j+k}
print(level1.method1(1))
//print(level1.method2(1,2)) //error
//print(level1.method3(1,2,3)) //error
print(level2.method1(1))
print(level2.method2(1,2))
//print(level2.method3(1,2,3)) //error
print(level3.method1(1))
print(level3.method2(1,2))
print(level3.method3(1,2,3))

とかやれば、level1 -> level2 -> level3で階層構造がちゃんとつくれますね。

ただ、なんかJavaScriptってルートにものがたくさんちらかっているようなイメージはあるんですよねぇ。
単にJavaScript1.xはモジュールのインクルードとかがやりづらかったからかなぁ。
処理の上では階層になっていても、明示的にインデントがないと雰囲気が出ないってのもあるかも(ぉぃ

そもそも、eclipseさんが使っているのは、いわゆるJavaScriptでなく、
JScript.NETなので、クラスはあるわ、.NET Frameworkのライブラリはがんがん使えるわ、ですしね。
そうそう、eclipseさんの日記のカテゴリ名はJScript.NETにしたほうがいいとおもいます。
わたしの場合、読んでいて「function Point(x:int, y:int) {」で型を指定してて、驚きました(w
#逆に言えば、ここ以外はJavaScript1.x/JScript/ECMAScript3と違いがないんですよね。

> Perlでやるには最善策かもしれませんね.Perlほとんど知らないけどw
Perlの場合、元が非オブジェクト指向なので、ハッシュはあくまでハッシュですからね。
むしろ、ハッシュがオブジェクトなのでなく、オブジェクトがハッシュを使って実装されてたりします。

> 私のとこの一時引数オブジェクトって書いてあるやつ.
ちょっと違うのが、PerlやRubyだと、hoehoge("foo"=>1,"bar"=>2)と書けることでしょうか。
内部的には変わらないのですけれどね。

> 俺言語(笑)ではクラスからインスタンスを生成するということを,オブジェクトのオーバーライドで表現しているんです.
aInstance = aClass.copy
aInstance.aVar1 = "something"
aInstance.aVar2 = "nanika"
という感じなのでしょうか。
クラスとはいいつつ、なんか‘プロトタイプ’(初期値を定義するもの)っぽいですね。

今までのわたしのクラス観では、クラスはインスタンスとは本質的に異なるものだったので、新鮮です。
#クラス=工場、インスタンス=製品、というような感じで
elipse's Programing Languageだと、クラス=原本、インスタンス=複製、って感じなのかなぁ。

> 吉良 Zabadak Xenosaga
ちなみに、ΩやPainといった曲でぎゅいいぃぃん、ぎゅいぎゅいん♪とか鳴らしてるのが吉良さんのようです(謎
XenosagaはChoronoCrossと違って町の音楽が無いのがあれなのですけど。
でもXenosaga2は光田さんじゃなくなっちゃうんですよね、残念。
他に何か大きなプロジェクトをやっていると聞いたけれど何をやっているのかなぁ。
ChronoTriggerやXenogearsをてがけ、ChronoCrossの不振で見かけなくなり、
最近DarkChronicleで復活した(?)加藤正人さんの新作とかかなとか思ってみたり。。
もしそうだったらおもしろそう・・・w
  【Re:23】 eclipse 【HOME】 2004年02月04日(水) 00時19分JST-9 【修正】
[ 2adF0rWtCng ]
>むしろ名前空間を分けるためのもの、記述をすっきりさせるためのもの、というイメージですね。
名前空間とクラスベースとは直接結びつかないと思うんだけどなぁ
JScript.NETでは多分こんなことできますよね.

namespace Graphic {
var Pen = {
width, color
}
}
namespace Client {
var pen = Graphic.Pen;
pen.width = 100
...
}

>一つの言語でプロトタイプベースにもクラスベースにも書ければ何も言うことはないです。
>JavaScriptなんかはその点、なんでもありという点でおもしろいですね。
どうもECMAScriptのprototypeってのは私の理想とは離れているようです.
しかもprototypeに似てるclass入れるなんて…邪道だw
マルチパラダイムはけっこうだけど被ってる機能を入れるのはねぇ…

>普段は、自由度の高い言語を厳格なガイドラインの下で使い、いざというときは自由度をフルに生かす、ような。
なるほどー. ちょっと経験不足でいまいち想像が沸きませんけどw

>処理の上では階層になっていても、明示的にインデントがないと雰囲気が出ないってのもあるかも(ぉぃ
そうですねぇ.ちょっとECMAScriptのprototypeってのは私が想像してたのとは違ってました.
というかアレってクラスみたいで…

>そうそう、eclipseさんの日記のカテゴリ名はJScript.NETにしたほうがいいとおもいます。
まぁ正確にはそうなんですけど… なるべく短い方がいいんでw

> 俺言語(笑)ではクラスからインスタンスを生成するということを,オブジェクトのオーバーライドで表現しているんです.
aInstance = aClass
aVar1 = "something"
aVar2 = "nanika"
こんな感じです.
>クラスとはいいつつ、なんか‘プロトタイプ’(初期値を定義するもの)っぽいですね。
クラスじゃ無いです.
「クラスベースにおけるクラスからインスタンスを生成すること」を「オブジェクトのオーバーライド」で表現してるってことです.

>elipse's Programing Languageだと、クラス=原本、インスタンス=複製、って感じなのかなぁ。
抽象クラスから継承するのと,クラスからインスタンス作るのって似てますよね.
それを統一しようよ,ていう考えでいます.そうすると必然的にクラスの存在を否定することになると.

>でもXenosaga2は光田さんじゃなくなっちゃうんですよね、残念。
ほぉ それは残念だなぁ.
つかXeno2早くだせ,シナリオ忘れちゃうよw
  【Re:24】 eclipse 【HOME】 2004年02月04日(水) 00時24分JST-9 【修正】
[ 2adF0rWtCng ]
>どうもECMAScriptのprototypeってのは私の理想とは離れているようです.
>しかもprototypeに似てるclass入れるなんて…邪道だw

>そうですねぇ.ちょっとECMAScriptのprototypeってのは私が想像してたのとは違ってました.
>というかアレってクラスみたいで…
すんません,同じこと2回も言ってるよ俺…(恥

あと,空白が消えちゃったんで一応補足
aInstance = aClass
____aVar1 = "something"
____aVar2 = "nanika"
  【Re:25】 名無したん 【HOME】 2004年02月04日(水) 13時49分JST-9 【修正】
[ tZmZrkcX18Y ]
> > > そういえば、MEG-OSってどうなったんですかー?
> > どうなったんだろう。。。(ぉ
> ちょっとちょtt、、
> せっかくZaurusでPC98エミュレータが動くようになったらしいから試してみようと思ったのにー
さいきんのアレはあまりPC98用じゃないとかなんとか・・・(あせあせ
  【Re:26】 成瀬ゆい 【HOME】 2004年02月04日(水) 22時27分JST-9 【修正】
[ GDqzJTJswmI ]
> 名前空間とクラスベースとは直接結びつかないと思うんだけどなぁ
直接結びつきはしませんね。
どちらかというと、クラスの機能の一つとして、名前空間がある、ということです。
C#やJScript.NETのようにnamespaceがある言語の場合は、その分クラスの必要性は減ります。
一方でRubyのようなnamespaceが無い言語では、クラスに名前空間的な要素があるわけです。

多くの言語でのMathクラスは、sinやfloor関数をまとめる名前空間として使われている、
というあたりを連想していただければ。
Rubyにもnamespaceが欲しいんですよねぇ・・・なんかRubyのライブラリってわかりにくくて。

> しかもprototypeに似てるclass入れるなんて…邪道だw
あれ、似てるclass・・・?
JavaScriptのprototypeってこんな感じで使うものだと思っていたのですが。
function Complex(x,y){
  this.x = x;
  this.y = y;
  this.display=function(){return this.x+"+"+this.y+"i"}
}
var com1 = new Complex(1,2);
var com2 = new Complex(2,3);
Complex.prototype.add = function(other){return new Complex(this.x+other.x,this.y+other.y)};
var com3 = com1.add(com2);
print(com3.display()); //=>"3+5i"
クラス定義を後から書き換えるもの〜と。
プロトタイプベースの‘プロトタイプ’とは微妙に違うもののような気がします。

そういえば、見たことのある例では常にクラスオブジェクトのprototypeをいじっているのだけれど、
インスタンスのprototypeをいじるとどうなるんだろ。
別に継承するのにprototypeを使う必要はないし・・・。

> マルチパラダイムはけっこうだけど被ってる機能を入れるのはねぇ…
マルチパラダイムといえば聞こえはいいですが・・・、実際は統一が取れていないだけのような気がしなくも(ぉ
特にこれといった思想があるのではなく、気づいたらThere's more than one way to do it.になっちゃってたって。

> 抽象クラスから継承するのと,クラスからインスタンス作るのって似てますよね.
あぁ、そこがポイントなのですな。
今まで継承とnewって全く別のイメージでした。
継承は工場が部品を一部外注したり、抽象クラスから見るとOEM出荷したりといったイメージで、
クラスからインスタンスを作るのは工場が製品を作ったり、クッキーの型で生地に穴を開けたりするイメージだったので。

確かにそういう捉え方をすると、抽象クラスも普通のクラスもインスタンスもみんな同じオブジェクトになりますね。
いわゆる‘コピペテンプレート’みたいな感じで、だんだんと中身を埋めていって、
インスタンスを作り、果ては関数呼び出しも・・・と。
そこまで一貫した考え方で表現できると面白いですねぇ。

それだとクラスがいらない・・・というか、クラスとインスタンスと関数呼び出し途中のと区別ができなさそうですな。

素のHTMLだと行頭の空白は消え、途中の空白も圧縮されてしまうんですよ。
<code> hogehoge</code>
とcodeタグでくくると空白が保存されるようになりますです。

> さいきんのアレはあまりPC98用じゃないとかなんとか・・・(あせあせ
あれれ、DOS/V用になっちゃったんですか?w
まぁ、そっちのほうが楽は楽ですけれど〜
  【Re:27】 eclipse 【HOME】 2004年02月05日(木) 20時09分JST-9 【修正】
[ 2adF0rWtCng ]
>どちらかというと、クラスの機能の一つとして、名前空間がある、ということです。
>C#やJScript.NETのようにnamespaceがある言語の場合は、その分クラスの必要性は減ります。
>一方でRubyのようなnamespaceが無い言語では、クラスに名前空間的な要素があるわけです。
クラスを純粋に名前空間として利用するってことはやったことないです.
というのは当然で名前空間を持たないオブジェクト指向言語使ったことないからですが.

>多くの言語でのMathクラスは、sinやfloor関数をまとめる名前空間として使われている、
Rubyにもありますよ.
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=Math

>Rubyにもnamespaceが欲しいんですよねぇ・・・なんかRubyのライブラリってわかりにくくて。
RubyにはModuleがありますよね.あれは名前空間だと思うのですが…

>マルチパラダイムといえば聞こえはいいですが・・・、実際は統一が取れていないだけのような気がしなくも(ぉ
そうですか.
例えばAOPとOOPは直交する考えだとかよく言われますよね.
GenericはOOとは関係ないけど組み合わせると記述力がかなり増しますよね.
私はかなり統一フェチですが(笑),ここは統一性に拘るところではないと思います.
言語は所詮道具ですから.

>継承は工場が部品を一部外注したり、抽象クラスから見るとOEM出荷したりといったイメージで、
>クラスからインスタンスを作るのは工場が製品を作ったり、クッキーの型で生地に穴を開けたりするイメージだったので。
クッキークラスの抽象クラスである食物クラスは食物工場だとすると外注するのは…
Food food = new Cookie();
なるほど.食物工場はクッキー工場に外注して食物を製造する.
新鮮ですw
クラスメンバは工場のメンバなのか.

>それだとクラスがいらない・・・というか、クラスとインスタンスと関数呼び出し途中のと区別ができなさそうですな。
まずクラスとインスタンスは区別ができないというより区別しないんですね.敢えてしない.
関数については特殊なオブジェクトということにするしかないですね.
これはどんな言語でもそうだと思いますが.

>とcodeタグでくくると空白が保存されるようになりますです。
了解しました.

ECMAScriptのprototypeに関してはまだ理解が浅いので後々レスします.
今ちょっと忙しくて真剣に考える時間が無くって… すみません.
  【Re:28】 成瀬ゆい 【HOME】 2004年02月06日(金) 19時58分JST-9 【修正】
[ GDqzJTJswmI ]
> というのは当然で名前空間を持たないオブジェクト指向言語使ったことないからですが.
名前空間でも、クラスやモジュールやfunctionのように「名前空間としての機能をもっているもの」でなく、
C#やJScript.NETのnamespaceのような、名前衝突を避けるために名前空間を作るものの話です。

RubyのMathモジュールの場合は「includeして(Mix-inして)使うためのもの」(=モジュール)を、
関数や定数をまとめておくもの(Folder/Directory/Dictionary)として使っている、と。
Rubyには純粋に名前空間を作るためだけのものは無いです。
Rubyの場合は、いきなりネストさせて、
class Com::Airemix::Foo::Bar
@@a = "b"
end
なんてことはできませんしね。

> RubyにはModuleがありますよね.あれは名前空間だと思うのですが…
RubyのModuleは、実装を伴ったinterfaceだと思います。
他のクラスにincludeされることを前提とした共有名前空間〜とも言えますが、
前述の純粋なnamespace的なものとは違うかと。
・・・
っと、C#のリファレンスを見直してみて気づいたのですが、
C#のnamespace/usingが、Rubyのmodule/includeと対応するのではないか、ということなのでしょうか。
確かにいわれてみれば・・・。
* 前者は名前の衝突を防ぐために作られ、後者はMix-inするために作られた。
* usingの場合は使っている関数は外にあるままだけど、includeの場合は自分の所にとりこんでいる。
* namespaceはネストさせて何ぼのものだけど、moduleはそうでもない。
などと考えていたので、そう考えたことはありませんでした。

そう考えると、C#やJavaのinterfaceって、実は必要が無い、ってことなのかな・・・?
namespaceとmoduleとinterfaceって実際上の違いはあるのだろうか。

> 私はかなり統一フェチですが(笑),ここは統一性に拘るところではないと思います.
えーっと、JavaScriptの場合ですとPrototype-baseとClass-baseなのですが、両方できるのならよいのですよ。
両方中途半端なので・・・(死
中途半端なりにうまく折衷して新たな境地を見出しているのなら、それはそれで素晴らしい事なのですが、
継承一つやるにもちょっと工夫しないといけないですしね・・・。
もっとも、JScript.NETではClass-baseにはちゃんと書けるようになったようですけれど。

http://www.interq.or.jp/student/exeal/dss/ejs/3/2.html
にJavaScriptでの継承のやり方が載っているのですが、いまいち綺麗でないし。。。

> クラスメンバは工場のメンバなのか.
ですです。
クラスのメンバ(=工場のメンバ)(例えば「無事故連続年数=3」「場所="長野"」)はあくまでクラス(工場)の情報であって、
インスタンスのメンバ(=クッキーのメンバ)と直接の関係はないのです。
cookie.constructor.place //=>"長野" //製造した工場は長野にある、だからどうした?

よくオブジェクト指向の解説本にあるクッキーとクッキーの型の比喩も同じですね。
CookieForm.made_of //=>"steel"
CookieForm.eatable? //=>false
cookie = new CookieForm
cookie.made_from //=>"小麦粉"
cookie.eatable? //=>true
という感じ。

プロトタイプベースだとこれとは違って、
cookie = new Object
cookie.material = "小麦粉"
cookie.eatable? = true
chocoChipCookie = new Object
chocoChipCookie.prototype = cookie
chocoChipCookie.material += "チョコレート"
chocoChipCookie.eatable? //=>true
みたいな感じでしょうか。

もしくは
template = new Object
template.display = func(){return self.S + "は" + self.C + "だ。"}
oopl = new Object
oopl.prototype = template
oopl.C = "OOPL"
message = new Object
message.prototype = oopl
message.S = "Java"
message.display() //=>"JavaはOOPLだ。"
みたいな。(このprototypeはJavaScriptのprototypeではないです)
(変な仮想言語作らずになにか典型的なプロトタイプベース言語を何かやらないと・・・)

こっちの場合、やっていることは
(function(s,c){return s + "は" + c + "だ。"})("Ruby","スクリプト言語") //=>"Rubyはスクリプト言語だ。"
と同じだけれど〜〜違う。
  【Re:29】 eclipse 【HOME】 2004年02月06日(金) 23時10分JST-9 【修正】
[ 2adF0rWtCng ]

>名前空間でも、クラスやモジュールやfunctionのように「名前空間としての機能をもっているもの」でなく、
>C#やJScript.NETのnamespaceのような、名前衝突を避けるために名前空間を作るものの話です。
成瀬さんは純粋な名前空間としての構文が用意されていない言語で,
名前空間としてクラスを利用する価値があるって言ってるんでしたよね.
それはオブジェクト(インスタンス)ではダメなのだろうか?
仮に純粋な名前空間を言語に用意するんだったら,その言語はクラスがあってもなくても関係ないですよね.

# ちなみにこの名前空間の話は成瀬さんの以下のレスの流れなつもりです.
>わたしにはクラス=静的なもの=制限というイメージはあまりないんです。
>むしろ名前空間を分けるためのもの、記述をすっきりさせるためのもの、というイメージですね。


>Rubyの場合は、いきなりネストさせて、
>class Com::Airemix::Foo::Bar
>@@a = "b"
>end
>なんてことはできませんしね。
ん.これはC#でもできませんね.

class Com.Airemix.Foo.Bar {
public static string a = "b";
}

多分こういうことですよね.

namespace Com.Airemix.Foo {
class Bar {
public static string a = "b";
}
}

で,Rubyは…

module Com::Airemix::Foo
class Bar
@@a = "b"
end
end

とはできないと.

module Com
module Airemix
module Foo
class Bar
@@a = "b"
end
end
end
end

こうしなきゃいけない.
なるほど.これはちょっと不便な事もありますね.
将来改良されないだろうか…

>C#のnamespace/usingが、Rubyのmodule/includeと対応するのではないか、ということなのでしょうか。
そです.内部的にどうなってるか知りませんが大体同じように使えますよね.
もっともmoduleの一番の目的はmixinかもしれませんが.

>* usingの場合は使っている関数は外にあるままだけど、includeの場合は自分の所にとりこんでいる。
これって概念的にはそうなんだけど,内部的には同じようなものだったりしませんかねぇ.
includeって全部コピってるわけではないですよね.

>そう考えると、C#やJavaのinterfaceって、実は必要が無い、ってことなのかな・・・?
え? 多重継承もMixinも無いので必要かと…
あ,それともnamespaceに直接フィールド/メソッドが書ければって話?
その機能はけっこう欲しかったりする.

>namespaceとmoduleとinterfaceって実際上の違いはあるのだろうか。
moduleがあればnamespaceとinterfaceがいらないってことですかね.(それがRubyかw)


>中途半端なりにうまく折衷して新たな境地を見出しているのなら、それはそれで素晴らしい事なのですが、
>えーっと、JavaScriptの場合ですとPrototype-baseとClass-baseなのですが、両方できるのならよいのですよ。
>両方中途半端なので・・・(死
あー なんかかみあってなかったです(汗
私も成瀬さんと同意見です.ちょっと誤解.

>http://www.interq.or.jp/student/exeal/dss/ejs/3/2.html
>にJavaScriptでの継承のやり方が載っているのですが、いまいち綺麗でないし。。。
ですね.
実は,クラスがない = プロトタイプベース
かと思ってたんですけど,これって間違いですかね.ぽいですよね.
私はプロトタイプベースってのはあまりよくわかってなくて
ただクラスが無い方がいいと考えているんですけど.
私が妄想してた言語は…オーバーライドベースとでも呼ぶべきか.
いやそんなことはないプロトタイプベースなのか?
相変らず脳内まとまってません(汗

# じっくり勉強したいんですけど卒論が…(言い訳
  【Re:30】 eclipse 【HOME】 2004年02月06日(金) 23時16分JST-9 【修正】
[ 2adF0rWtCng ]
>>C#のnamespace/usingが、Rubyのmodule/includeと対応するのではないか、ということなのでしょうか。
>そです.内部的にどうなってるか知りませんが大体同じように使えますよね.

>>* usingの場合は使っている関数は外にあるままだけど、includeの場合は自分の所にとりこんでいる。
>これって概念的にはそうなんだけど,内部的には同じようなものだったりしませんかねぇ.

ああ・・・ また支離滅裂なことを(泣
疲れてるんだよきっと許してっ

# 書き込み完了って修正できたのかっ
  【Re:31】 成瀬ゆい 【HOME】 2004年02月08日(日) 00時00分JST-9 【修正】
[ GDqzJTJswmI ]
> それはオブジェクト(インスタンス)ではダメなのだろうか?
プロトタイプベースにおけるオブジェクトで代用(?)できますね。
その場合はクラスの必要性が一つ減ることになります。

こんな感じで一つ一つクラスの必要性を減らしていけば、最終的には完全にクラスが必要なくなるね〜って意味だったのかなと。
今になって当時の発言を見返してみると(ぉぃ

また機能でなく使い方で考えると、
* インスタンスを作らないクラス(クラスメソッドとクラス定数、クラス変数しか持たない)はnamespaceやmoduleで代用できる。
* インスタンスしか作らないクラス(上と逆にクラスメソッドとかを持たない)はインスタンスベースの方が自然。
* シングルトンなクラスもインスタンスベースの方が自然。(妙な機構をつけなくてもよいし)
* クラスメソッドを持ち、しかもインスタンスを作るクラスはクラスベースの方が自然?(インスタンスベースでも変わらない気もする)
* 抽象クラスは・・・クラスベースの方が抽象ってイメージがでるような気もするけれど、たいした違いは無いかな。
という感じ。

== Rubyのnamespace
Ruby全体として、どうも名前の衝突について甘く考えているような気がします。
i = 0
array = ["a","b","c","d","e","f"]
array.each_index{|i|puts i.to_s+"="+array[i]}
puts i #=>5
とか典型例ですし、クラス変数も時々問題になっていた気が。(こちらは共にRuby2では対処するらしい)
あとは自分でクラスを定義していたら、後からRuby標準ライブラリに同じ名前のクラスが入ってきちゃうとか。

名前の衝突を考えなければCom::Airemix::Foo::Barなんてネストすることは無いので、
現在の仕様でも問題ないのでしょうけれど、一度衝突を心配しだすと・・・もう心配で心配で。
今度隙を見てRuby作者まつもとさんの日記にツッコミを入れてみようかな・・・。

> これって概念的にはそうなんだけど,内部的には同じようなものだったりしませんかねぇ.
* moduleはインスタンスからもmoduleの機能を呼び出せる。
* usingはクラス定義の記述からのみusing先のものを呼び出せる。
という点が、改めて考えてみると大きな違いかなと。
module Hoge; def fuga; puts "fuga"; end; end
class Foo; include Hoge; end
ins = Foo.new
ins.fuga #=>"fuga"
などとRubyではできますが、似たことをC#でnamespaceを使ってやろうとすると、
using System;
using ANameSpace;
namespace ANameSpace{
class Hoge{
public static void fuga(){
Console.WriteLine("fuga");
}
}
}
class Foo{
public void fuga(){
Hoge.fuga();
}
}
class Class1
[STAThread]
static void Main(string[] args){
Foo bar = new Foo();
bar.fuga();
}
}

とかやらないとダメですからね。
これがincludeとusingの違いかも。
#逆に考えるとこの違いはincludeとusingによるもので、moduleとnamespaceの違いではないのかもしれない

> え? 多重継承もMixinも無いので必要かと…
「namespace≒module」であり「module≒interface」、ゆえに「namespace≒interface」
だから、namespaceがあればinterfaceなんていらない〜などと考えてみたのですが、ちょっと早まったようですね(ぉ

> moduleがあればnamespaceとinterfaceがいらないってことですかね.(それがRubyかw)
namespace+interface≒moduleってことなのでしょうね。
後はmoduleに名前衝突を積極に避けられるような機構があれば言うことなし〜と。

> あ,それともnamespaceに直接フィールド/メソッドが書ければって話?
> その機能はけっこう欲しかったりする.
これはusingでは他のnamespaceを自分のnamespaceに取り込むことしかできないという制限とあわせて、
あえてmodule+include的に、includeしたものがインスタンスに直接影響するのを避けているような気がします。
using先の機能を、自分のクラスメソッドやインスタンスメソッドとして外部に公開するには、
何らかの形で明示的にラッピングしないといけない・・・、いかにもクラスベース、って感じの制限ですなぁ。

> クラスがない = プロトタイプベース
C言語はプロトタイプベースではないと思います(違

とりあえず何かプロトタイプベースのをやろうとIoLanguageをいじりつつリファレンスを見ていたら、
「サブクラスとインスタンスの間には何の違いもない」という記述が。
もしかして、これがプロトタイプベースな考え方の核心なのでは。
eclipseさんが前におっしゃった「抽象クラスから継承するのと,クラスからインスタンス作るのって似てますよね」も同じことなのでしょうね。
http://f21.aaacafe.ne.jp/~kizz/prog/io/ref/iovm_ref_j.html
結局の所、クラスが無いのではなく、クラスとインスタンスの区別が無いのが特徴なのかと。

ん、プロトタイプベースって、実は、クラスが無いんじゃなくてインスタンスが無いのでは?
インスタンスベースには、クラスベースのインスタンスメソッドに相当する、「継承して初めて発現するメソッド」ってありませんし。
Rubyの
class Foo; def self.hoge; puts "hoge" end end
class Bar<Foo; end
Bar.hoge #=>"hoge"
def Foo.hoge; puts "hoge2"end
Bar.hoge #=>"hoge2"
def Bar.hoge; puts "hoge3"end
Foo.hoge #=>"hoge2"
と、IoLanguageの
foo := Object clone
foo hoge := "hoge"
bar := foo clone
bar hoge #=>"hoge"
foo hoge := "hoge2"
bar hoge #=>"hoge2"
bar hoge := "hoge3"
foo hoge #=>"hoge2"
って、同じように思いません?
  【Re:32】 成瀬ゆい 【HOME】 2004年02月08日(日) 00時51分JST-9 【修正】
[ GDqzJTJswmI ]
http://www.airemix.com/HP_CGI/file/io20040129.zip
そうそう、Ioのインタプリタをコンパイルしてみました。
MinGWでコンパイルしたのでCygwinが無くても動きます。
http://squab.no-ip.com:8080/wiki/809
http://f21.aaacafe.ne.jp/~kizz/prog/io/ref/iovm_ref_j.html
http://user.ecc.u-tokyo.ac.jp/~s31552/wp/io/
  【Re:33】 eclipse 【HOME】 2004年02月09日(月) 20時57分JST-9 【修正】
[ 2adF0rWtCng ]
>こんな感じで一つ一つクラスの必要性を減らしていけば、最終的には完全にクラスが必要なくなるね〜って意味だったのかなと。
表現下手で申し訳ない…

>また機能でなく使い方で考えると、
全く同意であります.

>puts i #=>5
あらやだ.これは何か意図があるのかなぁ.

>あとは自分でクラスを定義していたら、後からRuby標準ライブラリに同じ名前のクラスが入ってきちゃうとか。
そういえば標準ライブラリってトップレベルに置いてるんですね.
まぁRubyはスクリプト言語なので,ワンラインでちょっとした処理書くときになるべく短く書けるようにってことでしょうか.


>* moduleはインスタンスからもmoduleの機能を呼び出せる。
>* usingはクラス定義の記述からのみusing先のものを呼び出せる。
なるほど.

>#逆に考えるとこの違いはincludeとusingによるもので、moduleとnamespaceの違いではないのかもしれない
そうですね.

>あえてmodule+include的に、includeしたものがインスタンスに直接影響するのを避けているような気がします。
んー.直接影響を受けるってのがちょっとよくわからないです.
適当に書いてみたけど問題が思い浮かばない…

using System;
namespace AName {
public const int num = 10;
}
namespace BName {
using AName;
class BClass {
public int num = 20;
public void Print {
Console.WriteLine(num.ToString()); // BClass.num
}
}
public void Print {
Console.WriteLine(num.ToString()); // AName.num
}
}
namespace CName {
using BName
public void Main() { // エントリーポイントがクラスに属さなく書けたらちょっと幸せかも
BClass.new().Print(); // 20
Print(); // 10
}
}



>「サブクラスとインスタンスの間には何の違いもない」という記述が。
おぉ.気が合いそうw

>もしかして、これがプロトタイプベースな考え方の核心なのでは。
そうだといいんですけど.
ECMAScriptに違う匂いを感じてしまったのは気のせいだろうか.

>結局の所、クラスが無いのではなく、クラスとインスタンスの区別が無いのが特徴なのかと。
そうなんですよね.
クラスという特別なオブジェクトを無くそうとしてるのに,
なんでprototype(ECMAScriptのような)なんて特別なオブジェクト(正しくはプロパティ?)が出てくるのか.そこが解せないんです.
委譲機構をうまーく作ってやるとそんなもの要らないハズですよ.多分.

>ん、プロトタイプベースって、実は、クラスが無いんじゃなくてインスタンスが無いのでは?
どっちもないっぽいような.あるのはオブジェクトですね.
クラスベースはオブジェクトを2つに役割分担させたんですね.
クラスあってのインスタンス.インスタンスあってのクラスだと思います.
ま,用語なんて文脈によってけっこう変わっちゃうもんですが.

>インスタンスベースには、クラスベースのインスタンスメソッドに相当する、「継承して初めて発現するメソッド」ってありませんし。
インスタンスベース == プロトタイプベース ですか?
継承して初めて発現するメソッドがないってのがわかりません.

parent := extends object;
parent.hello := { print "hello!"; }
child := extends parent;
child.hello(); #> hello!

妄想言語で恐縮ですが,プロトタイプベースでもこうなることは予想されますよね.

>って、同じように思いません?
同じですね.
cloneすると委譲されるのかぁ.
ちょっとクラスベースのプロトタイプパターンと紛らわしいですね.

>そうそう、Ioのインタプリタをコンパイラしてみました。
ありがたや。 触りてぇ〜!
誘惑しないでくださいよw
  【Re:34】 成瀬ゆい 【HOME】 2004年02月10日(火) 17時02分JST-9 【修正】
[ GDqzJTJswmI ]
> > puts i #=>5
> あらやだ.これは何か意図があるのかなぁ.
言語としてのバグでしょう。
http://rwiki.jin.gr.jp/cgi-bin/rw-cgi.rb?cmd=view;name=Ruby2.0spec
を見ると、Ruby2ではちゃんとi=0になるようですね。
って、namespaceも導入がほぼ固まってるのか、うれしいなあ。

> まぁRubyはスクリプト言語なので,ワンラインでちょっとした処理書くときになるべく短く書けるようにってことでしょうか.
それでしょうかねぇ。
まぁnamespaceが導入されれば.NETでいうSystemがルートでもよいかな。
掲示板スクリプトとか書いてて、Threadクラスを定義しようといきなり衝突して困ってたんですよね〜。

> > >あえてmodule+include的に、includeしたものがインスタンスに直接影響するのを避けているような気がします。
> んー.直接影響を受けるってのがちょっとよくわからないです.
> 適当に書いてみたけど問題が思い浮かばない…
そのコードをC#で動くようにすると、
using System;
namespace AName {
class AClass {
public const int num = 10;
}
}
namespace BName {
using AName;
class BClass {
public int num = 20;
public void Print() {
Console.WriteLine(num.ToString()); // BClass.num
}
}
class BClass2 {
static public void Print() {
Console.WriteLine(AClass.num.ToString()); // AName.num
}
}
}
namespace CName {
using BName;
class CClass{
static public void Main() {
(new BClass()).Print(); // 20
BClass2.Print(); // 10
}
}
}

となるわけです。
こちらだと「Console.WriteLine(AClass.num.ToString());」となっていたり、「BClass2.Print();」となっていたりで、
他のクラスのメソッド(定数)を呼ぶのにクラス名を明示しています。
クラス名を明示しないといけない => クラス名を経由して呼び出している => 間接的 => 直接影響を受けていない 〜と。

あと、「インスタンスに直接影響」の話ですと、Rubyでは、
module Bar; def bar; puts "bar" end end
class Foo; include Bar; def foo; puts "foo" end end
hoge = Foo.new
hoge.foo #=>"foo"
hoge.bar #=>"bar"
なんてことができるけれど、C#で素直にやろうとすると、
using System;
namespace Bar{
class Bar{
public static void bar(){Console.WriteLine("bar");}
}
}
namespace Foo{
using Bar;
class Foo{
// using Bar; //ここには書けない
public void foo(){Console.WriteLine("foo");}
}
class Class1{
[STAThread]
static void Main(string[] args){
Foo hoge = new Foo();
hoge.foo();
// hoge.bar(); // error CS0117: 'Foo.Foo' に 'bar' の定義がありません。
}
}
}

となってしまいます。
まぁ、これはこれで、こうしたほうがバグが少なくなると思う人がいるからこうしているのでしょうけれど。
D言語ではmoduleってあったんだっけ・・・?
そのうちみてみよう・・・そのうち、そのうち。

> ECMAScriptに違う匂いを感じてしまったのは気のせいだろうか.
今まで何度かECMAScriptに集中的にうちこんだりしてきたのですが、
何か他で学んできた概念をJavaScriptで実践してみようとすると、
最初はうまくいくように感じるのですが、すぐに壁に当たるんですよ。
思うに、ECMAScriptってプロトタイプベースではないのではないかと・・・。
ECMAScriptは、クラスベースでもなく、プロトタイプベースでもなく、ECMAScriptオブジェクト指向言語に基づいているのではないかと・・・。

> なんでprototype(ECMAScriptのような)なんて特別なオブジェクト(正しくはプロパティ?)が出てくるのか.そこが解せないんです.
ECMAScriptのprototypeは、いわゆるプロトタイプを操るものではないのですよ、たぶん。
クラスを定義した後で変更するためのもの、なのだと思います。
そもそも、prototypeが仕様に加わったのってJavaScript1.1からなんですよね。

邪推になるのですが、クラスのような大仰なものをJavaScriptに加えるまでもないと思ったNetscapeのプログラマが、
小耳に挟んだ‘ぷろとたいぷ’を彼なりの理解の下に実装してみた・・・、のでは。
言っちゃ悪いけれど、Netscapeの設計って筋が悪いものが多いですし・・・。
Frameやblink、JavaScriptStyleSheetにCookie、などなど。。
なんで、Coookieの時刻指定は(二ヶ月間有効とかでなく)絶対指定な上に、時刻フォーマットが独自なんだよっ(><

JScript.NET/JavaScript2/ECMAScript4が、半端なプロトタイプベースでなく、まともなクラスベースになったのは、彼にとって幸福だったのかも・・・。
願わくばまともなプロトタイプベース言語になって欲しかったけれど。
別にECMAScriptオブジェクト指向でもいいけれど、継承っぽいことくらい楽々できてくれないとねぇ。

> インスタンスベース == プロトタイプベース ですか?
インスタンスベース == プロトタイプベース == オブジェクトベース、らしいです。
で、そのケースの場合、
parent := extends object;
parent.hello := { print "hello!"; }
parent.hello() #> hello!
なので、継承しなくても発言しているわけです。
一方、クラスベースなRubyだと、
class Parent; def hello; puts "hello!" end end
# Parent.hello # error
child = new Parent
child.hello #=>"hello!"
と、継承(ここではインスタンス作成ですが)して初めて発現している、と。

> ちょっとクラスベースのプロトタイプパターンと紛らわしいですね.
あ、確かにそういわれてみれば。
それを意識して、“clone”という言葉を選んだのですかねぇ。

> 誘惑しないでくださいよw
ふふりw
とは言っても、単純な言語なので、ちょっと触ればなにやってるかわかり、もうちょっと触ると飽きるのでダイジョーブ(ぉぃ
使い込んでみれば奥が深いのでしょうけれど〜。
なにはともあれ、プロトタイプベースのかをりを感じるにはもってこいな感じ。
  【Re:35】 eclipse 【HOME】 2004年02月14日(土) 22時13分JST-9 【修正】
[ 2adF0rWtCng ]
>BClass.new().Print(); // 20
>(new BClass()).Print(); // 20
Ruby混じっちゃったw

>クラス名を明示しないといけない => クラス名を経由して呼び出している => 間接的 => 直接影響を受けていない 〜と。
>まぁ、これはこれで、こうしたほうがバグが少なくなると思う人がいるからこうしているのでしょうけれど。
そうなのかなぁ.静的解析で十分対応できるような気もしますが.

>D言語ではmoduleってあったんだっけ・・・?
>そのうちみてみよう・・・そのうち、そのうち。
D言語,最近熱いですよねぇ.
Linux/Windowsでネイティブで多機能.
どこまでメジャーになれるか楽しみですね.
私もそのうち…

>思うに、ECMAScriptってプロトタイプベースではないのではないかと・・・。
>ECMAScriptは、クラスベースでもなく、プロトタイプベースでもなく、ECMAScriptオブジェクト指向言語に基づいているのではないかと・・・。
ほぉ.
「ECMAScriptはよくできてるぞ.違和感はお前の理解力が足りんからだ.出直して来やがれ!」
とか言われそうで不安でしが,ベテランそう言ってもらえると心強いですw

>ECMAScriptのprototypeは、いわゆるプロトタイプを操るものではないのですよ、たぶん。
>クラスを定義した後で変更するためのもの、なのだと思います。
>小耳に挟んだ‘ぷろとたいぷ’を彼なりの理解の下に実装してみた・・・、のでは。
なるほど.
動的な側面があるのはいいけど,所詮prototypeは簡易言語としての機能なんでしょうかね.

>JScript.NET/JavaScript2/ECMAScript4が、半端なプロトタイプベースでなく、まともなクラスベースになったのは、彼にとって幸福だったのかも・・・。
>願わくばまともなプロトタイプベース言語になって欲しかったけれど。
ですねぇ.
とりあえずJScriptやめてIoかCecilをやりたくなってきました.
でもまだprototypeよくわかってないのですっきりしない〜

>と、継承(ここではインスタンス作成ですが)して初めて発現している、と。
メソッドが実行可能になるときを発現と呼んでいたのですか.了解です.

>それを意識して、“clone”という言葉を選んだのですかねぇ。
え,いや逆じゃないかなぁ.
Prototypeパターンのcloneは実体をコピーしますよね.
でもIoのcloneは委譲、つまり参照のコピーなんで紛らわしいなぁと.

>とは言っても、単純な言語なので、ちょっと触ればなにやってるかわかり、もうちょっと触ると飽きるのでダイジョーブ(ぉぃ
>使い込んでみれば奥が深いのでしょうけれど〜。
>なにはともあれ、プロトタイプベースのかをりを感じるにはもってこいな感じ。
ほぉ.いい感じですね.
とりあえず,あと一週間の,辛抱…
触り出すと止まらなくなるんでw
  【Re:36】 成瀬ゆい 【HOME】 2004年02月16日(月) 22時33分JST-9 【修正】
[ GDqzJTJswmI ]
> そうなのかなぁ.静的解析で十分対応できるような気もしますが.
Ruby同様、C#でもModule/includeを使うようにしても〜、ということでしょうか。
うーん、どうなんでしょうねぇ。
なんか聞いた話では世の中にはinterfaceがmoduleでないことに意味を見出している・・・、
interfaceに実装がないことを重要視している人々がいるらしいのですが、それと関係があるような気も。

単純にMix-inというものを知らなかったって線もありえますけれど(ぉぃ

> Linux/Windowsでネイティブで多機能.
LinuxでもWindowsでもネイティブというのがいいですよね〜。
Phobosですっけ、(ほぼ?)標準GUIライブラリがあるのもよいです。
あれがLinuxとWindowsでさくさく動くようになれば天下取れそうな気もします。
昔WideStudioもいじってみたのですが、あれはGUIが独自なので好きになれなかったんですよね。。

> ECMAScriptはよくできてるぞ.違和感はお前の理解力が足りんからだ
わたしもそう言われそう・・・w
でも、ECMAScriptが本当にプロトタイプベースでうまく実装されているのだったら、
ECMAScript4でクラスベースになっちゃったりはしないよな〜、とか考えるとたぶんあってるかと(ぉぃ

> とりあえずJScriptやめてIoかCecilをやりたくなってきました.
うふふ、Ioおもしろいですよぉ〜。
なんか積み木遊びをしているような気分です(謎

> Prototypeパターンのcloneは実体をコピーしますよね.
> でもIoのcloneは委譲、つまり参照のコピーなんで紛らわしいなぁと.
PrototypeパターンやRubyのcloneはclone元とclone先は対等だけれど、
Ioのcloneには親子関係がありますからねぇ・・・。
確かにそんな違和感みたいなものは感じました。

そういえば、クローン人間の話の時に、
「クローン人間って言ったってただの人造双子じゃん」という論と、
「独裁者が自分のクローンを作ったら大変〜」なんて論とがあったけれど、
これってもしかしたらcloneって言葉に二つの意味があるからなのかも。
これの場合、前者がPrototypeに対応し、後者がIoに対応する〜といった感じで。

どちらにしても紛らわしいから、
child := parent.inherit
とかの方がよさそ。

って、Selfだと
child: (| parent* = parent |).
なのか。。
こっちには慣れが必要そうだなぁ・・・。
  【Re:37】 eclipse 【HOME】 2004年02月19日(木) 06時45分JST-9 【修正】
[ 2adF0rWtCng ]
>あれがLinuxとWindowsでさくさく動くようになれば天下取れそうな気もします。
んでC#とJavaが滅んだら面白いですねぇw

>昔WideStudioもいじってみたのですが、あれはGUIが独自なので好きになれなかったんですよね。。
WideStudioて名前だけはちらほら聞いたことありますが,
マルチプラットホーム・フレームワーク付きIDEなのかな.

>でも、ECMAScriptが本当にプロトタイプベースでうまく実装されているのだったら、
>ECMAScript4でクラスベースになっちゃったりはしないよな〜、とか考えるとたぶんあってるかと(ぉぃ
確かに… そのうちprototype無くなったりてして.

>うふふ、Ioおもしろいですよぉ〜。
>なんか積み木遊びをしているような気分です(謎
ちょっとやってみました.
まだわからないことだらけですが,けっこういい感じですねぇ.
無名関数の適用ができないんだけどわかります?

method (x, x * x) (5)
5

25になって欲しいんですが.
まさか束縛しないとメソッド実行できないなんてことは…ないと思うんですが.

>Ioのcloneには親子関係がありますからねぇ・・・。
そですね.単なる参照でなくて親子関係.

>そういえば、クローン人間の話の時に、
>「クローン人間って言ったってただの人造双子じゃん」という論と、
>「独裁者が自分のクローンを作ったら大変〜」なんて論とがあったけれど、
>これってもしかしたらcloneって言葉に二つの意味があるからなのかも。
>これの場合、前者がPrototypeに対応し、後者がIoに対応する〜といった感じで。
でも人間のクローンの場合は一人を殴ったら別の一人も痛がるってことはないですよね?
だからPrototypeパターンだとか,そういう意味ではなく?

>どちらにしても紛らわしいから、
>child := parent.inherit
>とかの方がよさそ。
同意.それ好きですw

>って、Selfだと
>child: (| parent* = parent |).
>なのか。。
>こっちには慣れが必要そうだなぁ・・・。
なんかなぁ.
Smalltalkも読みにくいと思うんだけど,頭の切り換えが必要なんですかね.
一度慣れさえすればなんとかなるんだろうか…
でもそれまでが大変です.


そいえばいつの間にか某ゲームの発売日が決まってますね.
いやー長かった… つってもまだ2ヶ月以上先ですがw
  【Re:38】 成瀬ゆい 【HOME】 2004年02月20日(金) 00時14分JST-9 【修正】
[ GDqzJTJswmI ]
> んでC#とJavaが滅んだら面白いですねぇw
C#やJavaが、D言語とスクリプト言語系にユーザーを取られて衰退・・・ってのはありそうな気はしますねw

> マルチプラットホーム・フレームワーク付きIDEなのかな.
そんな感じですね。
もとはC++なのですが、近頃はRuby,Python,Perlも使えるようになりました。

> まさか束縛しないとメソッド実行できないなんてことは…ないと思うんですが.
その可能性はあるようにも思います。

Ioはメッセージ指向の言語なので、
bar := method(x,x*x)
とした場合、Lobby(ルートオブジェクト)のbarスロットにmethod(x,x*x)がセットされます。
で、呼び出すときは
Lobby bar(5)
とかするわけですが、この時は「Lobbyに、barというメッセージを送り、その引数として5を渡しているわけです。
method(x,x*x)で生成されるBlockオブジェクトに5を渡しているわけではないのです。

ALGOL系の連想で思い浮かべるであろう、
Lobby.bar(5)
の、「Lobbyオブジェクトのbarメソッドを呼び出し、引数として5を渡している」とは違います。

Ioのリファレンスを見た限りでは、Blockオブジェクトにメッセージを送って自分を実行させるようなメソッドはなかったので〜、
何らかの形で束縛しないとだめそうな気もします。

> でも人間のクローンの場合は一人を殴ったら別の一人も痛がるってことはないですよね?
それはクローンでなく同一人物への参照が二つあるのでは?
class Person
  attr_reader :count
  def initialize; @count=0 end
  def knock; @count+=1 end
end
foo = new Person
bar = foo
foo.knock
bar.count #=>1
hoge = foo.clone
hoge.knock
foo.count #=>1
みたいな。
そういえば、ブラック・ジャックとか超常現象なんちゃらでは、片方が怪我をするともう片方にあざが〜っていう双子がでてきますね。

って、わたしがPrototypeパターンを誤解しているような気がしてきた。。
Prototypeパターンって、RubyのObject#cloneと同じものという理解であってます?

> 同意.それ好きですw
というわけで、inheritで継承する、プロトタイプベースなのをRubyで書いてみました。

class Proto; end
class << Proto
  def inherit; Class.new(self) end
  def set_method(name, str); instance_eval "def #{name};#{str};end" end
  def [](key)
    key = "@" + key unless key[0] == ?@
    ancestors.find(proc{return}){|item|
      item.instance_variables.include?(key)
    }.instance_variable_get(key)
  end
  def []=(key, value)
    key = "@" + key unless key[0] == ?@
    return instance_variable_set(key,value)
    ancestors.find(proc{self}){|item|
      item.instance_variables.include?(key)
    }.instance_variable_set(key,value)
  end
end

BankAccountの一部も〜。
bankAccount = Proto.inherit
bankAccount.set_method 'dollars', "self['dollars']"
bankAccount.set_method 'dollars=(x)', "self['dollars'] = x"
bankAccount.set_method 'deposit(x)', "self['dollars'] = x"
bankAccount.set_method 'deposit(x)', "self.dollars += x"
bankAccount.set_method 'withdraw(x)', "self.dollars = [0, self.dollars - x].max"
bankAccount.dollars = 200

bankAccount.dollars #=>200
bankAccount.deposit(50) #=>250
bankAccount.withdraw(100) #=>150
bankAccount.withdraw(200) #=>0

myAccount=bankAccount.inherit
myAccount.dollars=100
myAccount.deposit(400) #=>500
bankAccount.dollars #=>0

> Smalltalkも読みにくいと思うんだけど,頭の切り換えが必要なんですかね.
代入が:=とかならともかく、:を使うのは違和感ありますねぇ。。

Smalltalkはメッセージ指向の親分格ですっけ。
あれは
3 + 4 * 5 #=> 35
なのがありえないw

もっとも、Lisperの「括弧が消えて見えなくなる」に比べればまだ普通なのでしょう、きっと(ぉ

Rubyのendも違和感あったけれど、使っていたら慣れてきたので、そっちも慣れるかなぁ・・・

> そいえばいつの間にか某ゲームの発売日が決まってますね.
最近情報がぽつぽつとでてきたのでまさか・・・とは思っていたのですが、決まってしまいましたねぇ。
ちょっと寂しいです(ぉ
で、やっぱり全年齢対象になったんですね〜。
ToHeart2が当初からPS2向けなあたりも、なんか市場の成熟を感じますな。
ここ数年はいわゆる「美少女系ゲーム」「ギャルゲー」「えちげー」の境界が曖昧になっていたけれど、また分化していくのかな。

とりあえずわたしは夏影よりよい曲があることを期待しよう(ぇ

###
かろかろさんのところを見て知ったのですが、FirefoxをRevontuletと呼ぼうという連盟があるのですね。
狐火にしてもオーロラにしても情緒があってよいですなぁ。
http://dotnote.jp/d/revontulet.php

でも、“Revontulet”はどこかの商標になっていたりしないのかな?
人々が勝手に通称として使う分には問題にならないでしょうけど。

###
しっかし、オマーン戦はどきどきしたなぁ・・・。
  【Re:39】 eclipse 【HOME】 2004年02月20日(金) 23時15分JST-9 【修正】
[ 2adF0rWtCng ]
>C#やJavaが、D言語とスクリプト言語系にユーザーを取られて衰退・・・ってのはありそうな気はしますねw
D同様なんでも詰め込め系言語ですが,Nemerleっていうのを知りました.
http://www.nemerle.org/index.html
なかなかよさげです.
いろいろと面白そう/便利そうなところがありますが,
一番目を惹かれるのはなんと言ってもマクロです.
まともなマクロ機能持ってる言語ってあんまり無いですよね.
実際使うかどうかは別としてあると安心感があるようなないようなw
でまぁ何でコイツを出してきたかというと,
.NETとかJVMなんかの仮想プラットホームは
言語文化の発展に貢献しているのではないかと感じたからです.
言語とライブラリを分けるメリットは物凄いですよね.
ネイティブもいいけどVMもいいよなぁ…ってw


>method(x,x*x)で生成されるBlockオブジェクトに5を渡しているわけではないのです。
まぁそれはわかりますが,なんとしかしようと思えばなんとかなりそうなんで.
Rubyの特異メソッドは処理系内部でクラス作ることで実現しているように,
無名関数適用も内部で一時的にバインドしてメッセージ渡して実行して終わったらアンバインドすれば…とか.

>Lobby.bar(5)
>の、「Lobbyオブジェクトのbarメソッドを呼び出し、引数として5を渡している」とは違います。
これって人間側の受け取り方/表現の仕方の違いなだけじゃないんですか?
Lobby.bat(5)はLobbyオブジェクトの持っているbatメソッドに5を引数として渡す
Lobby bat(5)はLobbyオブジェクトにメッセージbatを引数5と共に渡す
この2つ,実際内部処理に差はあるのでしょうか? 純粋に疑問です.

>Ioのリファレンスを見た限りでは、Blockオブジェクトにメッセージを送って自分を実行させるようなメソッドはなかったので〜、
>何らかの形で束縛しないとだめそうな気もします。
見あたりませんねぇ.これはかなり減点ですw


>それはクローンでなく同一人物への参照が二つあるのでは?
そういうことになりますが,Ioのcloneは同一人物への参照では?
Hoge := Object clone
とした時にObjectオブジェクトのスロットは複製されず,
HogeがObjectの参照(proto)を保持するだけですよね.
これは生物のクローンとは全然違うし,Prototypeパターンとも違うことになります.
Embedding(組み込み)とDelegation(委譲)のうち,これはDelegationであり,
Objectを殴ればHogeも痛がるのではないでしょうか.

>Prototypeパターンって、RubyのObject#cloneと同じものという理解であってます?
Object#cloneはよくわからないのですが,

Prototypeパターンの例でよく出てくるのは楽譜作成プログラムとか.
4分音符をアイコンから楽譜にD&Dして作ることができる.
これは普通に音符クラスのコンストラクタを呼んで4分音符オブジェクトを作った場合.
それ以外に既存の音符をマウスでCtrl押しながらD&Dすると音符が複製される.
これはコンストラクタではなくcloneメソッドを呼んだ場合.
で,新しく複製された4分音符は8分音符に変更したりできる.
この時はもちろん複製の元となった4分音符は変化しない.

つまり実体の複製ですが,一般的に1段階の実体コピーだと思います.
オブジェクトのフィールドは新しく領域確保されますが,フィールドの参照先は確保されないってことですね.

またまた濃い内容なので,
続きは明日レスしますw

# やっと自由な時間がでてきたー
  【Re:40】 成瀬ゆい 【HOME】 2004年02月21日(土) 18時14分JST-9 【修正】
[ GDqzJTJswmI ]
> D同様なんでも詰め込め系言語ですが,Nemerleっていうのを知りました.
ふむち、後で見てみます〜。

> まともなマクロ機能持ってる言語ってあんまり無いですよね.
C言語のマクロくらいにしか触れたことないのですが、あれって必要なものなのですか?
適切に設計された言語ならマクロ機能ってまったく使わないような感じがするのです。
マクロがほしくなる瞬間ってのがあるのでしょうか。
マクロって、マクロを使ったC言語のコードを他のマクロのない言語に移植しようとしてハマった記憶くらいしか(ぇ

> 言語とライブラリを分けるメリットは物凄いですよね.
.NET Frameworkを最初に聞いたときは驚きました。
どの言語でも同じライブラリを扱えるというのは素晴らしいですね。
どんなにアレな言語やマイナーな言語でも、なんちゃら.NETかなんちゃら#にさえなれば実用になるというのはおもしろい(笑
# for example COBOL.NET, FORTRAN.NET, F#などなど
Perl6のVM、ParrotもPerl6以外にRubyやPythonも動くようにする、とか言ってますね。
Monoのほうも頑張ってほしいです。

でも遅いのがね〜(ぉ #ムーアの法則を信じれば救われるのか?

> これって人間側の受け取り方/表現の仕方の違いなだけじゃないんですか?
メッセージ指向がよくわかってないので不確かですが、と前置きして。
メッセージ指向自体はオブジェクト指向やクラスベースなどと直行する考え方なので、共存可能です。
なので、メソッド呼び出しをメッセージ送信と言い換えることはできますね。(実際Rubyではやってますし)
ただ、一般に、メソッド呼び出しのほうがより静的、メッセージ送信の方が動的でしょう。

メソッド呼び出しの場合、foo.barはfooオブジェクトのbarメソッドを呼び出しているわけですが、
メッセージ送信の場合、必ずしもそうではないかもしれない、と。
生粋メッセージ指向言語を知らないので、不適切かもしれませんがRubyのサンプルを、
foo = Object.new
class << foo
  def method_missing(name)
    case name.to_s
    when /foo/; 'foo'
    when /bar/; 'bar'
    end
  end
end
foo.foo #=>"foo"
foo.foobar #=>"foo"
foo.barbarbar #=>"bar"
あとは、メッセージ指向な人には、selfのメソッドfooを呼ぶときに、
self.fooと書かず、selfを略して関数風にfooとだけ書くのに違和感があるとかも聞いた記憶が。
fooをメッセージだとすると、メッセージの送り先selfを明示的に書いてくれないとイヤ、なのだとか。

> 見あたりませんねぇ.これはかなり減点ですw
そういえば、eclipseさんって無名関数にこだわっているように感じるのですが、
無名関数だとなにかしらうれしいことってあるのですか?
副作用がないからってことかな。

> そういうことになりますが,Ioのcloneは同一人物への参照では?
違うと思いますよ。
hoge := Object clone
の場合、hoge != Objectかつhoge proto == Objectですから、同一人物への参照ではないかと。
会社の一部門を分社化したようなイメージですかね。

痛がる痛がらないの話は、(分社化した会社barが、元の会社からfooからどの程度独立しているかの話で、)
foo := Object clone
foo count := 0
foo knock := method(count+=1)
bar := foo clone
とした時、fooを殴ると、(独立性が低い間は元会社が赤字なれば)
foo knock
bar count #=>1
で、barも痛がってますが、(子会社も赤字になっちゃう)
bar count := 0
と、barに独自のcountを定義すれば、fooを殴っても、(独自の会計を持ち、他からも仕事を取っていれば、元会社が赤字になっても)
foo knock
bar count #=>0
barは痛がらないわけです。(子会社は困らない)
barに独自のcount(痛みを保持する部分?)を定義できるという点で、同一人物とはいえないかと。
barに独自のknockメソッドを定義することもできますしね。

同一人物という言葉があてはまるのは、
hoge := foo #cloneしない
ではないかな、と。

生物のクローンと似てるのは
fuga := foo shallowCopy
ですかね、「記憶」まで複製される点は映画っぽいですけれど。
(どちらかというと生物のクローンは「fooClone := foo.proto clone」かな)

> Object#cloneはよくわからないのですが,
Objectクラスのインスタンスメソッドcloneで、いわゆる‘浅いコピー’ですね。
IoLanguageで言うshallowCopyメソッドですな。

class Note; attr_accessor :length, :etc end
foo = Note.new
foo.length = 'quarter'
foo.etc = Hash.new
bar = foo.clone
bar.length #=>"quarter"
bar.length = 'eigth'
foo.length #=>"quarter"
foo.etc.equal?(bar.etc) #=>true #Object#equal?(other)はotherがself自身の時に真
ということでよいのですよね?
  【Re:41】 eclipse 【HOME】 2004年02月21日(土) 22時50分JST-9 【修正】
[ 2adF0rWtCng ]
>というわけで、inheritで継承する、プロトタイプベースなのをRubyで書いてみました。
おぉ… 動的だ〜
こういうことできるのっていいですね.

>代入が:=とかならともかく、:を使うのは違和感ありますねぇ。。
あとコレ… (|...|) なんか卵っぽいw
ちなみに:=が代入(assignment)だとキモイかな.多分定義(definition)ですよね.

>もっとも、Lisperの「括弧が消えて見えなくなる」に比べればまだ普通なのでしょう、きっと(ぉ
Lispの括弧はコンピュータのため.インデントは人間のため.
成瀬さんはLispとSmalltalkどっちが綺麗に見えますか?
私はLisp.特にSchemeは今のところ一番綺麗な言語だと思ってるんですが.
概念的に美しいのは言うまでもないと思いますが,見た目も美しく感じます.

>Rubyのendも違和感あったけれど、使っていたら慣れてきたので、そっちも慣れるかなぁ・・・
私の場合endはほとんど違和感なかったです.連続するとちょっと嫌ですが.


>ちょっと寂しいです(ぉ
その気持なんかわかるw

>で、やっぱり全年齢対象になったんですね〜。
>ToHeart2が当初からPS2向けなあたりも、なんか市場の成熟を感じますな。
いろいろと境界が曖昧になってますね.いいのか悪いのか知りませんがw

>とりあえずわたしは夏影よりよい曲があることを期待しよう(ぇ
夏影〜 いい曲ですよねぇ.
どっちかっていうと歌無しの方が好きです.
Liaさんは最高に好きなんですけどね.

>かろかろさんのところを見て知ったのですが、FirefoxをRevontuletと呼ぼうという連盟があるのですね。
>狐火にしてもオーロラにしても情緒があってよいですなぁ。
ほぉ.炎の狐と言えばポケモンでそういうのいましたよね.激しくどうでもいいけどw

>しっかし、オマーン戦はどきどきしたなぁ・・・。
見れなかったっす…残念. ちょっと忙しくて.



>適切に設計された言語ならマクロ機能ってまったく使わないような感じがするのです。
うーん… 適切に設計された言語といっても全ての人を満足させるのは現実的に無理ですよね.
だからそんなことは初めからあきらめて,代わりにプログラマが満足できるようにカスタマイズ可能に
してやろう ってのがマクロですよね.

>マクロがほしくなる瞬間ってのがあるのでしょうか。
マクロがあれば標準では自分が気に入らない言語でもある程度好みに近づけることができます.
例えばC#にはusing文というのがありますね.
これがもし無かったとしてもマクロがあれば自分で定義できます.
usingという名前は気に食わないんでletにして定義すると,

defmacro <let (class variable @constructor {body})> {
$class $variable = $@constructor;
try {
$body
} finally {
$variable.Dispose();
}
}

let (File f = new File("hoge.txt")) {
System.Console.WriteLine(f.ReadLine());
}

↑は↓のようにコンパイル前に展開されます.

File f = new File("hoge.txt");
try {
System.Console.WriteLine(f.ReadLine());
} finally {
f.Dispose();
}

defmacroはLispの真似です.


>生粋メッセージ指向言語を知らないので、不適切かもしれませんがRubyのサンプルを、
なるほど.
確かにこの例ではメソッド呼び出しがオブジェクトのメンバ関数の実行ではないですね.
うーむ・・・ メッセージモデルと無名関数の相性について考える必要があるなぁ.

>self.fooと書かず、selfを略して関数風にfooとだけ書くのに違和感があるとかも聞いた記憶が。
なるほど.それはわからなくもないです.

>そういえば、eclipseさんって無名関数にこだわっているように感じるのですが、
>無名関数だとなにかしらうれしいことってあるのですか?
>副作用がないからってことかな。
# 副作用は直接関係ないと思います.
無名関数は拘りますよ〜 C#で唯一許せないところが無名メソッドが無いところです.(C# 2.0 では付きますが)
デリゲートに機能を追加する文と機能の定義とが必ず離さなきゃいけないのは嫌です.
どんなに小さな処理でも名前を付けなきゃいけないのは嫌です.
例えば私はGUIアプリの開発段階でコンポーネントの状態変化時にデバッグ用のTextBoxに出力させたりってことをよくやります.

_hoge.StateChanged += new Hoge.StateChangedHandler(Hoge_StateChanged);
...
}
public void Hoge_StateChanged(Hoge.State state) {
this.OutputMessage(string.Format("state changed: {0}", state));
}

↑こういうのは無名メソッドがあればずっと書き易く,読み易く,変更し易くなります.↓

_hoge.StateChanged += lambda {
this.OutputMessage(string.Format("state changed: {0}", state));
};

これ以外にも高階関数の引数に無名関数を渡すというのは頻繁に使われると思います.(関数がファーストオブジェクトである言語であれば)
例えばソートでの比較条件を引数に取るとかよくありますよね.

def bsort(arg, cmp)
array = arg.clone
(0...array.size-1).each do |i|
(i+1...array.size).each do |j|
if (cmp.call(array[i],array[j]))
t = array[i]
array[i] = array[j]
array[j] = t
end
end
end
return array
end

s = ["one", "two", "three", "four", "five",
"six", "seven", "eight", "nine", "ten"]
p bsort(s, proc{|x,y| x > y})
p bsort(s, proc{|x,y| y > x})
p bsort(s, proc{|x,y| x.length > y.length})

実行結果
["eight", "five", "four", "nine", "one", "seven", "six", "ten", "three", "two"]
["two", "three", "ten", "six", "seven", "one", "nine", "four", "five", "eight"]
["one", "two", "six", "ten", "four", "nine", "five", "eight", "three", "seven"]

ここで関数のリテラル表現,つまり無名関数が使えないと非常に不便なわけです.

>hoge := Object clone
>の場合、hoge != Objectかつhoge proto == Objectですから、同一人物への参照ではないかと。
ああ…protoの事を同一人物への参照と言ったつもりなんです.
PrototypeパターンだったらObjectの中身をhogeに一つずつコピーすると.
# なんかお互いわかってるんだけど伝わらないっていう気が…

>ということでよいのですよね?
そです.それがいわゆるPrototypeパターンです.
  【Re:42】 成瀬ゆい 【HOME】 2004年02月22日(日) 18時14分JST-9 【修正】
[ GDqzJTJswmI ]
> D同様なんでも詰め込め系言語ですが,Nemerleっていうのを知りました.
「Quick summary of differences between Nemerle and C#」をたらたらと読んでいて軽く悪寒を覚えたので見直してみたら・・・、
「Nemerle is a new hybrid (functional, object-oriented and imperative) programming language for the .NET platform.」
ってちょーヘンタイ言語じゃないですかっ(ゎ

さて、見た感じ面白そうですし、使えそうですね。
たしかに関数型と手続き型のハイブリッドになっていて、新鮮な感じがします。
ifが常にelseを伴うというぶら下がりelseの解決法も鮮やか。
あと、これはC#と違ってNamespaceだけでなくClassに対してもusingできるんですね。

D言語に対する強みは、.NETゆえのライブラリの豊富さですか。
Nemerleのようなできてたかだか数ヶ月の(v0.1.0だからまだできてない!?)言語でも、
.NETの膨大なライブラリをガンガン使えるのは、いい時代に生まれたな〜って感じですね(笑

> あとコレ… (|...|) なんか卵っぽいw
卵・・・w

> ちなみに:=が代入(assignment)だとキモイかな.多分定義(definition)ですよね.
Pascalとかは=が比較で:=が代入なんですよ。

> 成瀬さんはLispとSmalltalkどっちが綺麗に見えますか?
どちらもHello, worldすらやったことないんですが〜、Lispの方が綺麗に感じますね。
全てがS式で表されているというのはシンプルでよいです。
Schemeは名前しか知らないや・・・今度いじってみよう。
Smalltalkは前にsqueakの本を立ち読みしたりとかしたのですが、どうも馴染めなかったなぁ。。。

っと、Lispとオブジェクト指向の相性ってどうなんですかね。
CLOSをチラッと見た限りでは、Perlのオブジェクト指向並みに無理があるような気がするのですが・・・。

> どっちかっていうと歌無しの方が好きです.
わたしも、夏影のオリジナルバージョンの方が好きですね。
一時期無限ループさせてずっと聞いてたなぁ。

> ほぉ.炎の狐と言えばポケモンでそういうのいましたよね.激しくどうでもいいけどw
いましたねぇ。
しかし、炎の狐ならよいけど、赤いきつねは酷いと思う・・・w

> マクロがあれば標準では自分が気に入らない言語でもある程度好みに近づけることができます.
これって普通の関数でよいのでは〜、って実行時に動かれたら負荷が気になるか。
じゃ普通の関数にコンパイル時実行フラグをつければ・・・、ってこれがマクロか。
なんかC言語マクロののちょっと妖しいイメージが先行してたかも^^;;
納得です。

ところで話はそれますが、C#のusingって働きすぎですよね。
includeとaliasとlet、全部一人にやらせんでもよかろうに・・・。

> うーむ・・・ メッセージモデルと無名関数の相性について考える必要があるなぁ.
そういえば、別の文脈だった気もしますが、「本当に 1 はオブジェクトか?」という問いもなかなか示唆的です。
前のRubyの例で、「1 + 2」→「1.+(2)」→「オブジェクト1にメッセージ+と引数2を渡している」としましたが、1ってただの自然数じゃないですか。
自然数なんかが本当にメッセージを受け取れるんですか?と。
「虚数なんて無い、あえて言うなら数は全て虚数だ」なんて話もありますが、所詮、数は抽象物です。
数がメッセージを受け取れるなら、無名関数だってメッセージを受け取れても不思議は無いですよねぇ。
#実際、多くの言語で自然数オブジェクトは‘低い扱い’を受けているわけで。(理由は別の効率面とかであるにせよ)

> デリゲートに機能を追加する文と機能の定義とが必ず離さなきゃいけないのは嫌です.
そうそう、そのあたりC#ってなんか冗長ですよね。
event周りとかあまりの冗長さに頭痛が。。

> _hoge.StateChanged += lambda { ... }
あ、そういえば確かにそういう時よくありますね。
確かにそれだけの関数に名前空間を消費されるのはイヤですね。

そういえば、C#の解説を見ていて、delegateやevent周りで、なぜ妙な宣言を何個もして、
面倒なことをやっているのかと思っていたのですが、その疑問がやっと解けましたよ。
“In C# one have delegates. This concept is quite similar to functional values.
However functional values are far more efficient and their types need not be declared before use. ”
http://www.nemerle.org/csharp-diff.html
C#には関数オブジェクトが無いのが原因だったのですな。
  【Re:43】 eclipse 【HOME】 2004年02月23日(月) 11時45分JST-9 【修正】
[ 2adF0rWtCng ]
>ってちょーヘンタイ言語じゃないですかっ(ゎ
ヘ,ヘンタイ…ぽ

>ifが常にelseを伴うというぶら下がりelseの解決法も鮮やか。
>あと、これはC#と違ってNamespaceだけでなくClassに対してもusingできるんですね。
変態さんにしてはけっこう痒いところに手が届いてますよねw


>Pascalとかは=が比較で:=が代入なんですよ。
ほぉ.まぁ比較==ってのも初めは変な感じがしたものですが,完全に慣れちゃってるなぁ.

>どちらもHello, worldすらやったことないんですが〜、Lispの方が綺麗に感じますね。
お,やっぱそういう人もいるんだなw
私がLispの美しさを力説しても友人は全くわかってくれませんでしたw
統一性があるのはいいけど,見た目が人を寄せ付けないって…
確かに最初はちょっとひくけど,少しでも慣れれば美しさに気づくはず…と勝手に思ってます.
# そう言えばあの時は教育機関で教える言語をCからLispに変えるべきだ,とか言ってましたw

>Schemeは名前しか知らないや・・・今度いじってみよう。
Rubyで述語に?を付けたり,破壊的関数に!を付けたりしてるのは多分Scheme讓りです.
あと関数が他のオブジェクトと同等に扱える(変数と関数の名前空間が同じ)のも特徴.
OOPLのC++に対するアンチテーゼがJavaなのと似てると思うんですよ,
CommonLispとSchemeの関係は.

>っと、Lispとオブジェクト指向の相性ってどうなんですかね。
>CLOSをチラッと見た限りでは、Perlのオブジェクト指向並みに無理があるような気がするのですが・・・。
そうですねぇ.
私もCLOSはちょっと好きになれないです.名前はかっこいいんだけどw
まず前置記法とOOとの相性が悪いような気がします.
CLOS以外のOOは知らないんで推測ですが.


>しかし、炎の狐ならよいけど、赤いきつねは酷いと思う・・・w
そんな別称があったのですかw


>これって普通の関数でよいのでは〜、って実行時に動かれたら負荷が気になるか。
負荷もそうだけど,普通の関数ではちょっと実現不可能ではないかな.
関数という単語の定義を拡張しちゃえばできるだろうけどw
例えばさっきのtry-finally使ってlet作るなんて技は…
あとRubyだったらendが嫌だから{}で書けるようにする,とかもできますよ.

>なんかC言語マクロののちょっと妖しいイメージが先行してたかも^^;;
Cのマクロはちょっと複雑なことしてくれると読めませんw
あれは複雑なことをするために作ったものではないからでしょう.
Lispのマクロはびびりますよ.
lambdaとcall/ccあれば大抵の制御構造は定義できちゃうとか.

>ところで話はそれますが、C#のusingって働きすぎですよね。
>includeとaliasとlet、全部一人にやらせんでもよかろうに・・・。
まったくです.
予約語減らしてわかりにくい文法になったら本末転倒…
C/C++もstaticとか使い回して初心者を混乱させてくれますが.
なんでわからないかなぁ(苦笑


>数がメッセージを受け取れるなら、無名関数だってメッセージを受け取れても不思議は無いですよねぇ。
soopyという言語が無名関数をメッセージモデルで綺麗に実現しています.
http://soopy.sourceforge.jp/
{arg:[x]; do:[x*x];} eval 5; #> 25
名前空間(オブジェクト)にevalメッセージを送ると関数が返ってきて,
そいつに5を送ると関数が実行されるわけです.
統一的なメッセージモデルです.名前空間とオブジェクトが同じみたいな雰囲気です.

メッセージモデルの親玉Smalltalkにもこういうのがあるはずだと思って調べてみたらやっぱりありました.
[:x | x * x] value: 5. ">25"

昔Smalltalkを齧ったときブロックで挫折したんですが,
LispのlambdaやRubyのブロックが理解できた今となっては
Smalltalkもけっこういけるような気がしてきましたw


>C#には関数オブジェクトが無いのが原因だったのですな。
静的に拘った結果でしょうね.
イベント/デリゲート/メソッドの関係は初心者には理解し難いと思いますよ.
私も使うまでよくわからなかったしw
  【Re:44】 午後の紅茶b 2004年02月23日(月) 17時27分JST-9 【修正】
[ rRvmEHBZLrw ]
>緑のたぬき(違
mozilla.org やもじら組をよく見ればわかりますが、狐ではなくて腹黒いヤツですね。
  【Re:45】 成瀬ゆい 【HOME】 2004年02月23日(月) 23時34分JST-9 【修正】
[ GDqzJTJswmI ]
> 変態さんにしてはけっこう痒いところに手が届いてますよねw
いや、むしろヘンタイさんだからここまでできるんでしょ(ぉぃ

> お,やっぱそういう人もいるんだなw
数はさほど多くはないでしょうが、結構いるとは思いますよ。
わたしも一時期はLispをいじるためにxyzzyを拾ってきたり、Meadowを入れたりしましたから(w
#ってかよく思い出してみたらHello, Worldくらいはやったことあったよ。

見た目は〜なれれば括弧は霞み、消えるものらしいですし、適切なエディタを使えばインデントや括弧の対応もやってくれますし〜。
構文木がそのままダンプされているんだ、と思えばとてもシンプルなものですよね。

で、Schemeですが、Gaucheをダウンロードして、コンパイルを試みてみました。
・・・configure失敗。。。
今度SFU3.5を入れたら再挑戦だ。。

> 私もCLOSはちょっと好きになれないです.名前はかっこいいんだけどw
確かに名前はかっこいいですねw

> 負荷もそうだけど,普通の関数ではちょっと実現不可能ではないかな.
Rubyだったらこの例はできますね。(Rubyでdisposeメソッドを呼ぶのはナンセンスですが・・・)
def let(f,&block)
  begin &block.yeild ensure f.dispose end
end
ただ、この例の場合、前処理をしてからFile f = new File("hoge.txt")する、とかだと確かに関数では無理ですね。

> 予約語減らしてわかりにくい文法になったら本末転倒…
たぶん、書くときは特に混乱しないからじゃないかな。
ある程度粗雑なコードがたまってこないと、同じ予約語ゆえによみにくい〜ってことは体感できませんから(笑

> soopyという言語が無名関数をメッセージモデルで綺麗に実現しています.
わー、soopyに手を出しましたか、わたしもやろうかなと思ったものの、ちょっとメッセージ指向に引いてたんですよね^^;;
オブジェクトをハッシュ(名前空間?)と見なし、そこにメッセージを送ることでいじりまわす、って発想は面白いです。

で、なんか今のメッセージ指向の言語って表記法が洗練されていないように感じるんですよね。
もっといい表記法がないものですかね、obj WO do SURU.とか var HA obj NO slot1 DEATH.みたいにするとかの(笑

> イベント/デリゲート/メソッドの関係は初心者には理解し難いと思いますよ.
なんで、obj.onChange += func(x){x*x};とかじゃだめなのか、本当に不思議でした。
全ては静的にしたかったがためだったのですねぇ。

=日記へのツッコミ=
> いろんな言語で無名関数
やはり関数型は綺麗ですね、Haskellなんかさすがの一言。
scoopyのargとdoが目障りなのが気になっちゃうかなぁ。
Perlは「sub{$_[0]**2}->(5);」とするとだいぶ短くなりますね、わかりにくくなるだけ説もあるので、eclipseさんの例で正しいとは思いますが(笑
Smalltalkが思ったより簡潔ですね、綺麗かどうかは今はコメントを回避。。
今の感覚では一番綺麗に感じるのはNemerleが一番綺麗に感じるかな〜。
さて、数年後にこの感覚はどう変わるのか(ぉ

=Bさん=
腹黒いやつ・・・?
  【Re:46】 午後の紅茶b 2004年02月24日(火) 00時01分JST-9 【修正】
[ rRvmEHBZLrw ]
そう。某漫画によるとレッサーパンダは腹黒い、らしい
  【Re:47】 成瀬ゆい 【HOME】 2004年02月24日(火) 23時07分JST-9 【修正】
[ GDqzJTJswmI ]
「ナマケモノが見てた」ってやつですか。
でも、レッサーパンダって呼び方はなんか風流じゃないね、、
  【Re:48】 eclipse 【HOME】 2004年02月24日(火) 23時42分JST-9 【修正】
[ 2adF0rWtCng ]
>見た目は〜なれれば括弧は霞み、消えるものらしいですし、適切なエディタを使えばインデントや括弧の対応もやってくれますし〜。
Lisp書く時はEmacsに相当助けられますね.
オートインデント,括弧の対応表示,S式単位の移動 etc...

>で、Schemeですが、Gaucheをダウンロードして、コンパイルを試みてみました。
>・・・configure失敗。。。
Cygwinにインストールしてみました.
私の場合はmakeの途中でリソース不足みたいになってcmd.exeすら起動しなくなったけど,
Windowsを再起動してからmake installしたら入りました.
なんか中で妙なことが起こっていたようでまともに使えるか妖しいです.
configure/make時もエラーいっぱい出てたし…


>Rubyだったらこの例はできますね。(Rubyでdisposeメソッドを呼ぶのはナンセンスですが・・・)
う… そう,Rubyはブロック渡し構文が用意されているので
かなりマクロのありがたみが減る部分はあると思います.
確かその事をまつもとさんも以前言ってたような.


>ある程度粗雑なコードがたまってこないと、同じ予約語ゆえによみにくい〜ってことは体感できませんから(笑
読み難いってほどじゃないですけど,やっぱり適切な意味の単語を使って欲しいです.
予約語ごときにケチらずに… とは言え度を過ぎるとよくないですけどね.


>わー、soopyに手を出しましたか、わたしもやろうかなと思ったものの、ちょっとメッセージ指向に引いてたんですよね^^;;
個人的にSmalltalkよりは馴染みやすいかと.
統一性は素晴しいんですが,もうちょっと簡略表現を許してくれるといい感じです.

>で、なんか今のメッセージ指向の言語って表記法が洗練されていないように感じるんですよね。
receiver method arguments
がって事ですか?
soopyはmethodとargumentsが同じmessageなことが綺麗だと思いますけど.
あ,文の区切りは;じゃなくて.にして欲しかったなぁ.

メッセージを送ってるってイメージが沸かないってことかな.
だったら
message -> receiver
とかどうでしょうか.
sumimさんとこのIo版BankAccountを変更してみました.


BankAccount := clone->Object
BankAccount.dollars := 200
dollars->BankAccount #==> 200
BankAccount.deposit := method(x,
self.dollars = dollars + x)
50->deposit->BankAccount #==> 250
BankAccount.withdraw := method(x,
self.dollars = [0,self.dollars - x]->max)
100->withdraw->BankAccount #==> 150
200->withdraw->BankAccount #==> 0
account := clone->BankAccount
dollar->account #==> 0
print->account

定義/代入/演算子は敢えてメッセージ送信メタファから外しました.
その方が綺麗というかわかりやすいと思うので.
messeage->receiver形式のOOPLはどっかで見たような気がします.


>やはり関数型は綺麗ですね、Haskellなんかさすがの一言。
日本語フォントだとYenマークになっちゃってちょっとアレですが,
バックスラッシュだと連続で出てきても安心かもw 比較的λに近いし.

>scoopyのargとdoが目障りなのが気になっちゃうかなぁ。
特殊な構文は極力入れないスタンスっぽいですね.
soopyは覚えることがほんとに少ない.
その代わりちょっと冗長になっちゃうとこがあるんで…
そこでマクロの出番ですよw マクロ入れてくれないかなぁ.

>Perlは「sub{$_[0]**2}->(5);」とするとだいぶ短くなりますね、わかりにくくなるだけ説もあるので、eclipseさんの例で正しいとは思いますが(笑
解読できません… だからPerlは嫌いだw

>Smalltalkが思ったより簡潔ですね、綺麗かどうかは今はコメントを回避。。
これだけ見るとまぁ綺麗なんですが.
それなりの量のコードを見るとなんかちょっとね…

Ioの関数リテラル(無名とは言えないw)を考えました.
(Object clone do(tmp := method(x, x * x))) tmp(5) #==> 25
こういう時もマクロがあれば簡略表記が可能になりますw
  【Re:49】 成瀬ゆい 【HOME】 2004年02月27日(金) 00時08分JST-9 【修正】
[ GDqzJTJswmI ]
> Cygwinにインストールしてみました.
うーむ、cygwinでもSchemeは茨の道ですか、、
とりあえず、SchemeってCommonLispやEmacsLispとどう違うんですか?
#って、CommonLispやEmacsLispを理解しているわけではないけれど、、

> soopyはmethodとargumentsが同じmessageなことが綺麗だと思いますけど.
methodとargumentsの数が少ない間は綺麗に思うのですが、数が増えてくるとなんか見づらいんですよ。
どれがreceiverでどれがmethodなのやら。
> これだけ見るとまぁ綺麗なんですが.
> それなりの量のコードを見るとなんかちょっとね…
これと多分似た感覚だと思います。

> message -> receiver
結構いいですね。
でもやっぱり主語(receiver)が文頭に欲しいかなぁ。
それを言っちゃうと、receiver.messageになっちゃうのですけど^^;;
#こっちはもっとメッセージっぽくない、、

> messeage->receiver形式のOOPLはどっかで見たような気がします.
Perlはreceiver->messageですね、かなり微妙です。
messageを送っているというより、何かがカスケードしているような雰囲気が・・・、
って、Smalltalkerは str.sub('a','b').sub('c','d') みたいに、
selfをどんどん変えていく処理って好きなんですっけ。
それだとこの感覚はある意味正しいのかなぁ。

> 特殊な構文は極力入れないスタンスっぽいですね.
書くときは特殊な構文が有ろうと無かろうと関係ないから、あった方がいいんですけどね〜。
もっとも、読むときは死ねますが(w #例えばPerlのように
  【Re:50】 eclipse 【HOME】 2004年02月28日(土) 16時19分JST-9 【修正】
[ 2adF0rWtCng ]
>うーむ、cygwinでもSchemeは茨の道ですか、、
あれ,成瀬さんCygwinじゃなかった?
Linuxだったらまともに動いてくれると思うんですが.
まぁScheme処理系は他にもいっぱいありますよ.
その中でもGaucheは日本では一番人気みたいですけど.
ちょっと遊ぶくらいならPetite Chez Scheme + ChezEditとか
http://www5a.biglobe.ne.jp/~sasagawa/MLEdit/Scheme/

>とりあえず、SchemeってCommonLispやEmacsLispとどう違うんですか?
実は他人にうまく説明できるほどわかってませんけど,知ってる範囲で言うと
まず関数と変数の名前空間を分けるかどうかという点があります.
CL/ELは分けるので,
(setq hoge 4)
(defun hoge (x) (* x x))
(hoge hoge) #==> 16
となります.
ところがSchemeは分けないので,
(set! hoge 4)
(define hoge (lambda (x) (* x x)))
(hoge hoge) #エラー
set!で設定した変数hogeの値がdefineで上書きされます.
で,*は数値を引数として取るのに関数が渡されたぞ!と怒られます.
これが私にとってはかなり大きな違いですね.
ところで無名関数を変数に入れるとどうなるか,という疑問が出てきますね.
(setq hoge (function (lambda (x) (* x x))))
(hoge 4) #エラー
CLでは変数に入れた関数はそのままでは実行できませんので,次のように
(funcall hoge 4)
としてやる必要があります.
定義によって作られた関数と代入によって作られた関数では実行方法が異なるわけです.
ここが個人的に気持ち悪いなと.
Schemeでは,
(set! hoge (lambda (x) (* x x)))
(hoge 4)
(define hoge (lambda (x) (* x x)))
(hoge 4)
名前空間が分かれていないために代入も定義も実行方法は同じです.

あとEmacs Lispはダイナミックスコープです.
これは一概に悪いとは言えませんがちょっと厄介な代物ですね.

それから標準関数の名前はけっこう重要です.
機能は同じでも名前が違うものがかなりあります.
例) (注:厳密には対応しないものもあります)
CL <=> Scheme
defmacro <=> define-syntax
defun,defvar <=> define
setq <=> set!
listp <=> list?
nreverse <=> reverse!
progn <=> begin
t/nil <=> #t/#f
とにかくSchemeの方が意味がわかりやすいです.# この感覚は自然なはず.

あと言語仕様と直接関係ありませんが,
Schemeコミュニティでは繰返し構文を使用することを邪道だと考える人,副作用を嫌う人が多いような気がします.
より関数指向ということですね.

詳しく知りたければ次のページで.(オリジナルが消えてるみたいなんでgoogleキャッシュ)
http://www.google.co.jp/search?q=cache:LasZRc4rEyIJ:www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/comparison.html+&hl=ja&lr=lang_ja&ie=UTF-8


>でもやっぱり主語(receiver)が文頭に欲しいかなぁ。
receiverって主語じゃないのではないかと思うのですがどうでしょう.
「sender が message を receiver に送る.」ですよね.
senderはそのコードコンテキストのオブジェクトだから省略されるわけですが.

>Perlはreceiver->messageですね、かなり微妙です。
>messageを送っているというより、何かがカスケードしているような雰囲気が・・・、
C++から受け継いだものでしょうかね.

>書くときは特殊な構文が有ろうと無かろうと関係ないから、あった方がいいんですけどね〜。
>もっとも、読むときは死ねますが(w #例えばPerlのように
そのバランスのセンスが言語設計には重要ですね.
そこはC#,Ruby,Schemeあたりはそれなりに上手くできてると思います.
  【Re:51】 午後の紅茶b 2004年02月28日(土) 23時34分JST-9 【修正】
[ rRvmEHBZLrw ]
BSD機をこさえたはずなんでそちらへ振ってやってくさい。
  【Re:52】 成瀬ゆい 【HOME】 2004年02月29日(日) 03時58分JST-9 【修正】
[ GDqzJTJswmI ]
およ、日記が見れないぞ。。

> あれ,成瀬さんCygwinじゃなかった?
いえ、わたしはMINGWですよ。
あのioもMINGWでコンパイルしてます。

> ちょっと遊ぶくらいならPetite Chez Scheme + ChezEditとか
ふむち、こっちで遊んでみます。

> まず関数と変数の名前空間を分けるかどうかという点があります.
分けないとゲッター/セッターをつけないといけないから面倒じゃない?
って、オブジェクト指向じゃないからそうでもないのか。
関数を渡すことを考えると同じほうが楽ですね。

> それから標準関数の名前はけっこう重要です.
そういえば、setqのqってなんやねん、とか思ったなぁ・・・。

> 「sender が message を receiver に送る.」ですよね.
送る時はそうですが、そのmessageが実行されるのはreceiverの文脈でなので、
「receiverがsenderからmessageを受け取る」かと。
receiver <- message
って感じか。。
Nemerleのmutableな変数代入と紛らわしいな(==

> BSD機をこさえたはずなんでそちらへ振ってやってくさい。
あ、そういえばw
最近いじってないなぁ・・・、NetBSD1.7が出たら今度はWebサーバーに・・・シタイデス(ぉぃ
  【Re:53】 午後の紅茶b 2004年02月29日(日) 06時55分JST-9 【修正】
[ rRvmEHBZLrw ]
unixつかうならMTAくらい使わんと、、
ローカルテスト用のhttpdだけならM$で充分
  【Re:54】 成瀬ゆい 【HOME】 2004年03月01日(月) 10時42分JST-9 【修正】
[ GDqzJTJswmI ]
ですよねぇ。
でも、いちいち引っ張り出してくるのが面倒で(ぉぃ
FTTHになったらもっと本格的に使いたいんですけどね〜。
  【Re:55】 午後の紅茶b 2004年03月01日(月) 13時14分JST-9 【修正】
[ rRvmEHBZLrw ]
兼Gatewayにしてつけっぱなし〜
内部にはプラスター君とか来なくて、良かったりする
  【Re:56】 eclipse 【HOME】 2004年03月06日(土) 17時56分JST-9 【修正】
[ 2adF0rWtCng ]
>いえ、わたしはMINGWですよ。
なるほど.MinGWはCygwinより厳しいかもしれませんね.

>分けないとゲッター/セッターをつけないといけないから面倒じゃない?
>って、オブジェクト指向じゃないからそうでもないのか。
オブジェクト指向ではそうかもしれませんね.
C#で型とプロパティ名が同じでも可能なのはいいと思いました.
変数とプロパティはできなかったかな.

>そういえば、setqのqってなんやねん、とか思ったなぁ・・・。
(setq var 10) = (set (quote var) 10) なんですよね.
シンボルと変数名の関係とか評価の制御とかはLisp始めたころちょっと戸惑った覚えがあります.

>送る時はそうですが、そのmessageが実行されるのはreceiverの文脈でなので、
>「receiverがsenderからmessageを受け取る」かと。
なるほど.確かにreceiverを主人公として見ても全然問題無かった(汗
  【Re:57】 成瀬ゆい 【HOME】 2004年03月07日(日) 04時04分JST-9 【修正】
[ GDqzJTJswmI ]
> なるほど.MinGWはCygwinより厳しいかもしれませんね.
MSYSとかいうのを入れているので、configureとかシェルスクリプトとかまではなんとかなるのですが、
実際に使うと壁が多いですね。

> シンボルと変数名の関係とか評価の制御とかはLisp始めたころちょっと戸惑った覚えがあります.
あ、そうか、RubyのSymbolのルーツってこれだったのですね。

> なるほど.確かにreceiverを主人公として見ても全然問題無かった(汗
で、
receiver arguments verb.
と並べてみるのはどうかな〜、なんて考えてみるのですよ。
そうすると日本語文法ベースなプログラミング言語が作れるんじゃないかなって。

「.」と「の」の類似性とかも考えてみたことがあったっけなぁ
  【Re:58】 eclipse 【HOME】 2004年03月10日(水) 22時38分JST-9 【修正】
[ 2adF0rWtCng ]
> あ、そうか、RubyのSymbolのルーツってこれだったのですね。
シンボルはなにかと便利ですが,名前を操れるようにするとどうしても動的になってしまいますね.
だから採用されている言語が少ないんだと思います.

>receiver arguments verb.
>そうすると日本語文法ベースなプログラミング言語が作れるんじゃないかなって。
確かに日本語風になりますね.
でもちょっと具体的な利点は思い浮かびません(^^;

>「.」と「の」の類似性とかも考えてみたことがあったっけなぁ
A of B を B.A と書くのはそれなりにわかりやすいと思いますが,私は.を文末に使うのが好きです.
;はちょっと汚ないし,何もなしだと改行が強制されるのでけっこう不便です.
そうするとofに使えるのは:とか/とかになるかなぁ.
両方に.を使うということもできなくはないですが,可読性が下がっちゃいますね.
こういうこと考えるのって楽しいですよねw


なんか最近tDiaryの調子が悪くってげんなり…
  【Re:59】 成瀬ゆい 【HOME】 2004年03月12日(金) 02時04分JST-9 【修正】
[ GDqzJTJswmI ]
> でもちょっと具体的な利点は思い浮かびません(^^;
んー、RPNとも関連しますが、verbのとる引数が固定されていれば、括弧を使わずに記述できる・・・かも?
ぐらいですかねぇ。
あくまで思考実験、って感じが否めませんが^^;;

> ;はちょっと汚ないし,何もなしだと改行が強制されるのでけっこう不便です.
OCalmの;;は信じられないと思いましたがー(ぉ
Rubyの原則改行区切り、一行に詰め込みたい時には;を使える、というのは慣れると楽ですね。
文末に必ず何かをつけないといけない、というのはめんどくさいかも。

> そうするとofに使えるのは:とか/とかになるかなぁ.
んー、:だとなんかMacのパス区切りみたいですね。
もっとも、ネストしたクラスをParent::Childとか表記したりはするので、それを考えると結構いいかも。
/もよいけれど、これは割り算がありますからねぇ、、、

> なんか最近tDiaryの調子が悪くってげんなり…
近頃何回かに一回は見れない状態になってますねぇ。

で、eclipseさんも光速より速い光を読んでいらっしゃるのですね。
なかなかおもしろいですよね〜。
理論の詳細が省かれているのはアレですけれど、、(もっとも書かれていてもわからなかったろうけど)
個人的には‘ワープ’が可能かもしれない、という点には心躍ったり。
  【Re:60】 eclipse 【HOME】 2004年03月12日(金) 11時11分JST-9 【修正】
[ 2adF0rWtCng ]
>んー、RPNとも関連しますが、verbのとる引数が固定されていれば、括弧を使わずに記述できる・・・かも?
RPNって何かと思ったら逆ポーランドですか.
引数の数が固定されちゃうのはかなり痛いので括弧省略は現実的ではないかと…
可変個引数や関数オーバーロードを許さないってことですよね.
それに括弧無しでずらずら書かれるのって読みにくいと思います.
括弧だらけのLispの方がまだましのような気も…w

>OCalmの;;は信じられないと思いましたがー(ぉ
あれは論外ですね.考えたやつの面を見てみたいw

>Rubyの原則改行区切り、一行に詰め込みたい時には;を使える、というのは慣れると楽ですね。
>文末に必ず何かをつけないといけない、というのはめんどくさいかも。
Ruby式は文字数は減るんですが,それしかいいことないように思います.
プログラムの意味的区切り(節)と外見の区切り(行)は完全に独立であって欲しいというか…

>んー、:だとなんかMacのパス区切りみたいですね。
パス区切りに使われているから選んだような気も…
unixの/,macの:,URLの., windowsの\は円記号でなければ可w

>/もよいけれど、これは割り算がありますからねぇ、、、
/の前にスペースがあれば演算子として解釈するとか.この方法はけっこうやられてますね.
あとは基本演算子を変えちゃうってのも手かと.
ほとんどの記号文字を論理・算術演算子が予約しちゃってる言語が多いですが,
これに従わなきゃいけない理由もないです.
私としては頻繁に使う表現にこれらの記号は割り合てられるべきだと考えています.


>近頃何回かに一回は見れない状態になってますねぇ。
Referer無しで飛ぶとエラーになったり,
内容の追加だと平気なのに変更だとエラーになったり…
謎の挙動をしていまして,再インストールするしかないのかなぁと.


>で、eclipseさんも光速より速い光を読んでいらっしゃるのですね。
>なかなかおもしろいですよね〜。
このスレッドの上の方で見かけて知ったのですが(笑),図書館で発見したので借りて読んでみました.
この人文才ありますよね.多くの人が共感できる人柄だし.
最先端の科学者というと変わり者という先入観があるのですがw

>理論の詳細が省かれているのはアレですけれど、、(もっとも書かれていてもわからなかったろうけど)
>個人的には‘ワープ’が可能かもしれない、という点には心躍ったり。
光速が30万km/sよりもずっと速い領域があって,それに沿っていけば〜って感じでしたっけ.
宇宙論って面白いんだけど想像力がついていけないです…
宇宙誕生の瞬間なんて再現できないし,再現できたとしても観測できないし.
時間が第4の次元だということですらよく理解できていません.
  【Re:61】 randy(Soopyの中の人) 2004年03月12日(金) 20時09分JST-9 【修正】
[ ac5yAxS6HvA ]
はじめまして。お邪魔します。
ちと気になったところがあったのでツッコミ。

> soopyはmethodとargumentsが同じmessageなことが綺麗だと思いますけど.
> あ,文の区切りは;じゃなくて.にして欲しかったなぁ.

これはですね。
ピリオドだと画面の解像度などによっては、非常に見にくくなるからです。
(ピリオドも実は考えました。)

> そこでマクロの出番ですよw マクロ入れてくれないかなぁ.

Lispだとマクロを使う場面でも、Soopyでは関数で
切り抜けることを推奨しています(ということにしておく)。
たとえば、Common Lispだとwith-open-fileというマクロがありますが、
Soopyでも同じようなことが関数で可能です。


fun with_openIn_file(filename, body){
comment: "open input-file & eval body & close file";
var: [fin];
do: [
fin = openIn filename;
body eval(fin);
fin close;
];
rescue: [
if(fin isNil?){
false: fin close;
};
];
};


という関数で実現出来たりします。
使い方は、↓のとおり。


with_openIn_file ("foo.txt") {
arg: [fin];
var: [list];
do: [
list = fin readLines;
list map hogehoge;
];
};



なんとなく構文が増えたような気がしてお得! って感じしてもらえないでしょうか?(^_^;
  【Re:62】 成瀬ゆい 【HOME】 2004年03月13日(土) 02時02分JST-9 【修正】
[ GDqzJTJswmI ]
> 引数の数が固定されちゃうのはかなり痛いので括弧省略は現実的ではないかと…
うーむ・・・。
それじゃreceiverはreciverマークを、verbはverbマークをつけたらどうでしょ。
receiverはマークとしてその前に「(」を、verbはその後に「)」をつけて・・・、
(a 1 set)
(b 2 set)
(c (a b add) set)
(c print) #=>3
微妙・・・。

verbの後に取る引数の数を書くのも面白そうなんだけどなぁ。。
1 2 3 add2 4 add3 5 div2 6 7 add2 8 add2 9 sub2 add2 #=>14
みたいに〜、読みづらいですがw

> プログラムの意味的区切り(節)と外見の区切り(行)は完全に独立であって欲しいというか…
わたしはある程度「プログラムは見た目による」ようになって欲しいかな。

> unixの/,macの:,URLの., windowsの\は円記号でなければ可w
いつになったらバックスラッシュと円記号を区別できるのかなぁ・・・(==

で、ふと思ったのですが、/だとXSLTみたいですね。
配列やハッシュをXPathであらわしたり、するとPerlスライスみたいなものが綺麗に表せて、
非XML系プログラミング言語でも試してみると結構使えるかも。。。

ALGOL系の呪縛から逃れても良いのなら、算術演算子を廃して、addやsubとかにしちゃってもいいんですよね。

> この人文才ありますよね.多くの人が共感できる人柄だし.
単純に物語だけ追ってもおもしろい、というのは凄いですよね。
ジャーナリストが書いたわけじゃないのに〜。

> 光速が30万km/sよりもずっと速い領域があって,それに沿っていけば〜って感じでしたっけ.
そですそです、他の恒星系に事実上行けないだなんて耐えられないし、
地球の人と火星の人がリアルタイムネット対戦できないというのもありえなーいですよ。
火星とでは箱庭諸島くらいしかできないなんて・・・。

> 時間が第4の次元だということですらよく理解できていません.
状況によって人が同じ時間を長く感じたり短く感じたりするのは、
量子的なものであるところの人間の感覚が時空のゆがみを感知するから・・・、とか妄想してみたり(ぇ
  【Re:63】 成瀬ゆい 【HOME】 2004年03月13日(土) 04時58分JST-9 【修正】
[ GDqzJTJswmI ]
はじめまして、わざわざのお越しありがとうございます。
結構いろいろなところで書き込みを拝見するような気が・・・(笑

ほぉ、soopyもブロック(?)を引数に取れたんですね。
リファレンスを読んでもどこにも書いてなかったような。
関数がブロックを引数に取れると、ぐんと自由度が上がりますね。
  【Re:64】 eclipse 【HOME】 2004年03月13日(土) 15時08分JST-9 【修正】
[ 2adF0rWtCng ]
はじめまして. >randyさん
作者様降臨とは…びっくりしました.

>ピリオドだと画面の解像度などによっては、非常に見にくくなるからです。
なるほど.つまり目立つように;を選んだのですね.
私は逆に目立って欲しくないから.の方がいいと思ったわけでしたw

>Lispだとマクロを使う場面でも、Soopyでは関数で
>切り抜けることを推奨しています(ということにしておく)。
with-open-fileの例を見て,
「あれ? Rubyみたいだ.ブロック渡しの特殊構文がサポートされているのか」
とか一瞬勘違いしてしまいました.
これ,全く自然な表記なんですね.
多分成瀬さんも騙された(?)のではないかと思うのですがw
("foo.txt") と敢えて不要な括弧を付けたところがミソですね.

こういう風にオブジェクトリテラルをメッセージとして受け渡しすることによって
構文っぽい表現にすることができるということは凄いと思います.
これに倣ってCのfor文を定義してみるとこんな感じになりますね.


for = {arg:[init, cond, incr, body];
do:[
loop {
from: init eval ();
while: cond eval ();
step: incr eval ();
do: body eval ();
};
];
} eval;

for {do:[i = 0];} {do:[i < 10];} {do:[i = i + 1];} {
do:[
print i;
];
};

綺麗と言えば綺麗なんです.正直感動しましたw
ここにマクロをいれるのは勿体無い気もしてきました.
純水に不純物を入れるような感じがして…
でも見た目としては冗長だと思うんですよ.

そこで提案なんですが,{do:[foo;bar;];}を{foo;bar;}と省略してもいいってのはどうでしょう?
関数定義などのdoラベルも省略可能ってことで.
対応するラベルがない文はdoラベルに属することにするということです.
こうするとインデントのネストもかなり浅くできそうです.

頻繁に現れる表現の省略表記を許してもらえると概念上だけでなく,
見た目としても美しい言語になるのではないかと思います.
是非ご検討お願いします(^^;


>receiverはマークとしてその前に「(」を、verbはその後に「)」をつけて・・・、
Lispみたいだ. それは素敵だと思いますよw

>verbの後に取る引数の数を書くのも面白そうなんだけどなぁ。。
一般的な構文解析だと無理っぽくないですかね.
引数の前に引数の数を知っていないと…

>で、ふと思ったのですが、/だとXSLTみたいですね。
>配列やハッシュをXPathであらわしたり、するとPerlスライスみたいなものが綺麗に表せて、
>非XML系プログラミング言語でも試してみると結構使えるかも。。。
ちょっと私の理解の範囲を越える事をおっしゃってますなw
何のことやらサパーリですみませんw

>ALGOL系の呪縛から逃れても良いのなら、算術演算子を廃して、addやsubとかにしちゃってもいいんですよね。
コンピュータ業界って数多くの呪縛がありますよね.
一番強く感じるのがUNIX.WindowsなんてUNIXと大して変わらないじゃんとか思いますよ.
変わることを恐れている人が多いのかわかりませんが.
個人にしろ集団にしろ変わらないものを求めている場合が多いために変わらないものが強いようです.
C++なんてまさに変わってないからこそ勝った言語ですよね.

>そですそです、他の恒星系に事実上行けないだなんて耐えられないし、
現実問題として行ける/行けないはともかく,理論上無理ということになると確かに凹みますよねw

>状況によって人が同じ時間を長く感じたり短く感じたりするのは、
>量子的なものであるところの人間の感覚が時空のゆがみを感知するから・・・、とか妄想してみたり(ぇ
年を重ねる毎に時間が過ぎるのが速く感じるのは,体重が増えることによって時空の歪みが大きくなるからw
  【Re:65】 randy 2004年03月13日(土) 23時09分JST-9 【修正】
[ LZHfA06U/y. ]
>成瀬さん

> ほぉ、soopyもブロック(?)を引数に取れたんですね。
> リファレンスを読んでもどこにも書いてなかったような。

eclipseさんも、

> これ,全く自然な表記なんですね.
> 多分成瀬さんも騙された(?)のではないかと思うのですがw
> ("foo.txt") と敢えて不要な括弧を付けたところがミソですね.

と仰っているように、実は上の例は特殊な構文ではなくて
Soopyでは基本的な構文の組み合わせで実現されています。

もうお気付きかもしれませんが、一応説明しておきます。

関数with_openIn_fileの呼び出しの部分ですが、
 1番目の引数が、文字列("foo.txt")
 2番目の引数が、オブジェクト( {} で囲まれた部分 )
になっています。
つまり、次のように書くとわかるように

 with_openIn_file 文字列 オブジェクト;

という単なる関数コールなんです。
で、関数with_openIn_fileに渡されたオブジェクト(body)は
with_openIn_fileのなかの
 body eval(fin);
というところで関数化されて、finを引数として呼び出されている
という仕組みです。


>eclipseさん

C言語風forを自分も定義してみました。


fun for(init, cond, step, body){
do: [
loop {
from: init head;
while: cond head;
step: step head;
do: body eval ();
};
];
};

for [i=0] [i < 10] [i = i + 1] {
do: [ println i ];
};


と思ったら動かない。。。処理系のバグでした。(-_-;
とりあえず、作者の強みでバグを直しておきましょう。
(このバグ取りVersionのリリースは明日あたりにしたいなぁ)

ついでに全部リストでやってみました。


fun for2(init, cond, step, body){
do: [
loop {
from: init head;
while: cond head;
step: step head;
do: body each {arg:[dammy]; do: [];}; # do: では何もしない。 
};
];
};

for2 [i=0] [i < 10] [i = i + 1] [
print "i = "; println i;
];


こんなんで、どうでしょう?

> そこで提案なんですが,{do:[foo;bar;];}を{foo;bar;}と省略してもいいってのはどうでしょう?
> 関数定義などのdoラベルも省略可能ってことで.
> 対応するラベルがない文はdoラベルに属することにするということです.
> こうするとインデントのネストもかなり浅くできそうです.

これをやるとすると、構文解析がうまくいくかなぁ。。。その辺が心配です。
で、上でやったように、do: が邪魔な時にはリストを使って
うまく誤魔化してやるのは駄目ですか?

あとインデントが深くなるのは、ifで単なる真偽値で処理を分けたいときにも

if(cond){
true: foo;
false: bar;
};


とかやるのが問題なのかなぁ、とも考えたり。。。
これを、ifは真偽値での処理の分岐に限定して、
パターンマッチはcaseを導入するとかすればいいのか、とも考えたり。

あ、あと、Emacs(& xyzzy)用のSoopy-modeでも作れば
ある程度、インデントが深いことに対する不満は減ったりするかも、と夢想してたりします。
  【Re:66】 成瀬ゆい 【HOME】 2004年03月14日(日) 05時09分JST-9 【修正】
[ GDqzJTJswmI ]
うあ、完全に騙されてました。
fun f(a,b){do:[a+b];};
f(1)1; #=>2
と同じことだったのですね。
{}をみてブロックだと思いこんでいました。

for2 [i=0] [i < 10] [i = i + 1] [ print "i = "; println i;];
のリストを使った手法はおもしろいですね。

if文はやっぱりif(cond){foo}else{bar}であってほしいかもしれませんね。。
caseとかmatchとかを使った方がわかりやすいように感じます。

> Lispみたいだ. それは素敵だと思いますよw
結局、Lispのverbを最後に移動しただけなんですよね。
なので、簡単なトランスレータを書けば実装できるような気がしてきましたw
(a 1 set!)を(set! a 1)に並び替えるだけですからね。

> 一般的な構文解析だと無理っぽくないですかね.
たぶん実装としては、一行の内容をすべてスタックに叩き込んで、あとはRPN風に処理していけばいいかな〜と。
実用性があるかというと、おそらく無いでしょうけれど^^;;

> 何のことやらサパーリですみませんw
XSLT的な要素を普通の言語に持ち込んだらおもしろいかな〜と。
class AAA
BBB = 2
CCC = 3
end
print /AAA/* #=> [2, 3]
のような〜。
自分でもまだうまく整理できてないのでへっぽこな例ですけれど^^;;

> コンピュータ業界って数多くの呪縛がありますよね.
結局、慣習に従っておかないと、生き残りは難しいんですよねぇ。。。
言語立ち上げと同時にキラーアプリを何個か持っていれば、なんとかなるのかもしれませんが・・・。
Modula3のcvsupみたいな感じに。

> 年を重ねる毎に時間が過ぎるのが速く感じるのは,体重が増えることによって時空の歪みが大きくなるからw
そっそうだったのかっw
  【Re:67】 午後の紅茶b 2004年03月14日(日) 06時20分JST-9 【修正】
[ rRvmEHBZLrw ]
>Modula3のcvsup
これ何とかなってるの?
apache-docs-jaがこれを採用したおかげで仕方なく入れましたが。
rsyncで事足りるわけで。。
  【Re:68】 eclipse 【HOME】 2004年03月14日(日) 15時11分JST-9 【修正】
[ 2adF0rWtCng ]
>こんなんで、どうでしょう?
なるほど,リストを使えばいいのか.
リストに命令並べるだけで逐次処理になったのか!

バグというのはトップレベルで[i = 0;]; とすると [i = 0]と表示されるだけで
i = 0が実行されないということでしょうか.
それとも[i = 0;] head;としないとi = 0は実行されないのでしょうか.

>で、上でやったように、do: が邪魔な時にはリストを使って
>うまく誤魔化してやるのは駄目ですか?
リストを使う方法によってdo:省略のありがたみは半減したと思います.
でもまだ半分インデントの問題がありますけど.
というかまだ大して使ってもいないのに作者様に面倒な変更を要求するのもアレなので,
この案は脳の片隅にでも置いといて下さいw


>これを、ifは真偽値での処理の分岐に限定して、
>パターンマッチはcaseを導入するとかすればいいのか、とも考えたり。
これも微妙ですねぇ.
私は勝手にrandyさんは統一性大好きな人だと認識しているのですがw
いろんな文を用意するとどうしても汚なく見えてしまう.
書き易さと美しさのトレードオフですね.
でもやっぱりif(cond){true:foo;false:bar;};は簡易表記できるといいかも.
Soopyを普及させるつもりならw

>あ、あと、Emacs(& xyzzy)用のSoopy-modeでも作れば
>ある程度、インデントが深いことに対する不満は減ったりするかも、と夢想してたりします。
あー いいですねぇ 欲しいなぁ.
やってみようかなぁ… それとも既に作ってます?

ところでこういったSoopyネタをここで続けるのはrandyさんにも成瀬さんにも失礼かなぁと思いました.
SoopyのML or Wikiに移動した方がいいでしょうかね?


>結局、Lispのverbを最後に移動しただけなんですよね。
>なので、簡単なトランスレータを書けば実装できるような気がしてきましたw
ですね.
もしかして日本人は本来は後置記の方が馴染み易いのでしょうか.
プログラミングをやったことがない人にアンケート取ってみたらどうなるだろう.

>たぶん実装としては、一行の内容をすべてスタックに叩き込んで、あとはRPN風に処理していけばいいかな〜と。
>実用性があるかというと、おそらく無いでしょうけれど^^;;
ほぉ. まぁ発想としては面白いで終わっちゃいますねw

>print /AAA/* #=> [2, 3]
おぉ〜 なんか楽しそうだぞw
実はXSLT触ったことないのですが,これからの時代は必要ですかねぇ.
何故か私は流行り物には魅力を感じない体質でして…

>言語立ち上げと同時にキラーアプリを何個か持っていれば、なんとかなるのかもしれませんが・・・。
重要ですね.アプリが最大の宣伝ですから.
あとは開発環境とライブラリ.がんばってください >全てのマイナー言語作者w
  【Re:69】 ボヤッキー 2004年03月14日(日) 19時22分JST-9 【修正】
[ sbkSeeISCU. ]
プログラミングの話しで盛り上がってるときに空気も読まずに関係ない話を投下。
残念だったね明智君ははははとハイテンションな挨拶を。

韓国はごたごたしてるし、妹は東京に一人暮らしだとか騒いでいるわけですが、私はあい変わらず仙台でのんびりです。
仙台駅東口がミニ秋葉原化しててなかなかいい感じ。SofmapやさくらやにつづいてLaoxが撤退したのはあれですが。

で、光ファイバを引くついでに新PCをというわけで、K6-3 333MHzを使ってたので一気に高性能機が欲しいとAthlon64なPCを自作しようと
思ったわけですが、よく考えてみるとOffice(もちろんOpenOffice)とネットぐらいしか使い道ないのにオーバースペックな予感なんですよねこれが。
かといって応答速度16nsの液晶では3Dバリバリなゲームは出来るのか出来ないのか。と言うわけで最近の人はハイスペックなPCで何をするのか教えてくれなさい。
  【Re:70】 randy 2004年03月14日(日) 20時21分JST-9 【修正】
[ LZHfA06U/y. ]
> fun f(a,b){do:[a+b];};
> f(1)1; #=>2
> と同じことだったのですね。

そうそう、そうです。

> {}をみてブロックだと思いこんでいました。

Soopyでは、{}に囲まれた部分は、構文上すべてネームスペースに
なっています。(実際にはifの場合、順番が問題になるので
内部的にはネームスペースとして処理はされてはいないのですが、
見た目は一緒ということで。。。)

> if文はやっぱりif(cond){foo}else{bar}であってほしいかもしれませんね。。
> caseとかmatchとかを使った方がわかりやすいように感じます。

> これも微妙ですねぇ.
> 私は勝手にrandyさんは統一性大好きな人だと認識しているのですがw
> いろんな文を用意するとどうしても汚なく見えてしまう.

で、この辺の問題なんですが、ifとcaseとかに分けてしまうと
上で書いた{}がすべてネームスペースという統一性が
おそらく崩れるでしょうねぇ。
私は「統一性大好き」人間というわけではないですが、
Soopyに限っては統一性が重要だと思うので。
(いや、統一性は好きです。ただ、「大」はつかないかも。)

ふと思ったんですが、真偽値専用のifは関数として
定義出来そうな気がしますね。とりあえず、なんか関数を
でっちあげて、それで誤魔化しときましょうか。 < 誰を?

> バグというのはトップレベルで[i = 0;]; とすると [i = 0]と表示されるだけで
> i = 0が実行されないということでしょうか.
> それとも[i = 0;] head;としないとi = 0は実行されないのでしょうか.

今ここで明かされる驚愕の事実!
っていうほどでもないですが、ドキュメントで触れてなかったような気がするので。(^_^;
実はSoopyでは、リストは遅延評価されます。

i = 0;

のとき

[i = i + 1]

というリストがあった場合、遅延評価機構を持たない言語だと、このリストはすぐに

[1]

というリストに変換(?)されてしまいますが、Soopyでは、[i = i + 1]のままです。
つまり、リストの最初の要素は、式 i = i + 1 が入ったままです。
ですから、[i = 0] head; しないと変数iに0が代入されることはありません。
で、バグの件は、[i = 0] head; したときに式 i = 0 が
そのまま返ってきてたんです。(>_<)
ほんとは、i = 0 を実行して、その結果を返して欲しかったのに。。。


> あー いいですねぇ 欲しいなぁ.
> やってみようかなぁ… それとも既に作ってます?

いえ、一度やろうかと思ってメジャーモードの作り方を
WEBでちょっと勉強しようとしてみたんですが、
なかなか日本語で参考になりそうなところが少なくて。
あと、時間もないし。。。
もし、eclipseさんが作って下さったら、非常にうれしいです。
完成したら、Soopy本体と一緒に配布したいぐらいです。

> ところでこういったSoopyネタをここで続けるのはrandyさんにも成瀬さんにも失礼かなぁと思いました.
> SoopyのML or Wikiに移動した方がいいでしょうかね?

あ、そうか。
この掲示板が気に入ったので、つい長居し過ぎてしまったかな?
私は全然かまわないのですが、成瀬さんに迷惑でしょうね。
では、この後はWikiのほうに移動しましょうか?
(すんごいシンプルなWikiで申し訳ないですが。)

一応、誘導用にリンクをはらせてくださいね。 > 成瀬さん。
(もしかして興味を持った人がいないとも限らないし)

http://soopy.sourceforge.jp/cgi-bin/wiki.cgi
  【Re:71】 太りすぎ 2004年03月14日(日) 22時13分JST-9 【修正】
[ hQBuuAWAi3I ]
え〜
ボヤッキー殿

わしのは応答速度25msの19インチ液晶ですが
なかなか3Dはきついものがありますな
でもゲームによるんだけどね
カプコンのカオスレギオンとか画面がぐちゃぐちゃな感じ
ほかのFPSのゲームもキャラクターが
やや分身や残像を出してくれるので
なんか狙いが定まらない

液晶買いたてはわしのAKが全く当たらなくなって
CS引退気味になりました
最近はようやくなれてきたけどね

というわけでゲームするなら断然CRT!
液晶ももっと高速にならないかな

それにしてもこうプログラムっぽい話は
全くわからんな
乳輪は授乳しやすいように
赤いのに黒人の乳輪はなぜ黒いのか
くらい全くわからんな
  【Re:72】 成瀬ゆい 【HOME】 2004年03月15日(月) 03時59分JST-9 【修正】
[ GDqzJTJswmI ]
=Bさん=
> これ何とかなってるの?
cvsup側からすると最大の欠点ですよね、、
けれど、Modula3からすると最高のキラーアプリケーションだと思います。
MacOSXにModula3が移植されたのもcvsupの貢献が大きいでしょうし。

=eclipseさん=
> ところでこういったSoopyネタをここで続けるのはrandyさんにも成瀬さんにも失礼かなぁと思いました.
わたしは構いませんよ。
わたしもsoopyには興味がありましたしね。

> もしかして日本人は本来は後置記の方が馴染み易いのでしょうか.
うーん、そうなんでしょ。
とりあえずわたしは、RPNの初めて知ったときとてもときめきましたね。
アンケートとって見るのは面白いかも、今度やってみることにしよっと。

> 実はXSLT触ったことないのですが,これからの時代は必要ですかねぇ.
言っちゃ悪いのですが、XSLTなんか使わなくても、XML文書を他の形式に変換するのが目的なら、
SAXやDOMを使ったってできますから、必ずしも必要ではないと思います。
ただ、テンプレートドリブンなのはおもしろいですし、(わたしはXSLT以外にその手のものに触ったことないので)
それに付随したXPointerやXPathあたりの香りとかはおもしろいな〜と。

> あとは開発環境とライブラリ.がんばってください >全てのマイナー言語作者w
ライブラリは.NETってうれしいですね。

=ボヤッキーさん=
> 残念だったね明智君ははははとハイテンションな挨拶を。
えぇ、残念でした。
ま、まだ次をやらないといけないのでがんばるですよ。

> 韓国はごたごたしてるし、
韓国は・・・ねぇ。
結局両班時代と同じ話だよ、といわれると微妙に納得。

> 私はあい変わらず仙台でのんびりです。
仙台か〜、遊びに行ってみるのも面白いかな(ぉ

> で、光ファイバを引くついでに新PCをというわけで、
おぉ、光ファイバーですか。
うちもそろそろ引きたいなと画策中です。
Bフレッツ+IIJmioコースか、Bフレッツ+その他のISPコースか、TEPCO光コースか、どれになるかはわたしの話術しだい。
IIJmioの固定IP&IPv6がとっても魅力なのですが〜。

> K6-3 333MHzを使ってたので一気に高性能機が欲しいとAthlon64なPCを自作しようと
あなたにはかなりオーバースペックな気がします(笑
あ、でも、LinuxとかBSDとかをまるごとコンパイルする時はよいかもしれませんよ。

> と言うわけで最近の人はハイスペックなPCで何をするのか教えてくれなさい。
わたしはロースペックなのでわかりません(死

=randyさん=
> で、この辺の問題なんですが、ifとcaseとかに分けてしまうと
> 上で書いた{}がすべてネームスペースという統一性が
> おそらく崩れるでしょうねぇ。
わたしは、case(match)は今のifをそのまま変える〜というイメージだったのです。
ただ、caseはC言語のイメージがあるので、それと区別する意味で、
「match」を使った方がいいかな、とも。

で、問題はC言語風ifなのですが・・・、
これもリストを使えばいいのではないでしょうか。
if (cond) then [foo] else [bar]
とか。
#ifは関数として「then」や「else」はなんだろう・・・メッセージかな

あとは、Nemerleのように、本体はあくまで現ifで、
macroみたいなもので糖衣構文を用意してやるとか・・・ですかね。

ネームスペース直下に文を置けるようになると解決できそうですけれどねぇ・・・。
#暗黙のdo:をおくなりして、

> 実はSoopyでは、リストは遅延評価されます。
なんでi=i+1がちゃんと機能する(はず)なのかな、と思っていたら、それがキモだったのですね。

そういえば、このforの場合iはグローバルな変数になってしまいますよね。
これをローカルなものにすることはできないのでしょうか。
i=3;
for2 [i=0] [i < 10] [i = i + 1] [ print "i = "; println i;];
i; #=>3
となるように。

> 私は全然かまわないのですが、成瀬さんに迷惑でしょうね。
わたしも全く迷惑なんてことはありませんよ。
もともと特に話題を決めた掲示板というわけでもありませんしね。

ここで話をしてても、他のsoopyユーザーの参考にはならないかな、というのはありますけれどね・・・。
もっとも、個人的なイメージなのですが、Wikiって情報物置として使うのには便利なものの、
議論をするのには使うのには向いていないようなイメージはあるのですが。。

せっかく気に入っていただけたのですから、使ってくださるとうれしいですよ。
話題が複数あっても混ざらないようにするためのスレッド式掲示板なわけですしね。
  【Re:73】 久方巴 2004年03月15日(月) 05時35分JST-9 【修正】
[ hqc2DdUInNY ]
>>>ボヤッキー様

>光ファイバー
みなさんいいなぁ。
うちもそろそろ1MbpsのADSLに(ぉ
ヤフーとか個人情報漏れまくりなのでDIONあたりにしようかと。

>Office(もちろんOpenOffice)

でも最近のオフィススイートは結構重たいのが増えました。
うちのAthlonXP機にしても、クイック起動を入れておかないと結構遅かったです。
むしろ15GBプラッタ時代のHDDの遅さも響いてる気が...
#そういえばAthlon64の売りにQool'inQuietでクロック可変〜てのがありますが、
#UNIX系OSだとつかえるのでしょうか

液晶でゲームやると影響でるみたいですね。
お絵かきがメインだと(最近の液晶では)あんまり気になりませんが。
#15インチのCRTを使ってますが、ナナオのL557Rが欲しいこのごろ
  【Re:75】 eclipse 【HOME】 2004年03月15日(月) 21時37分JST-9 【修正】
[ 2adF0rWtCng ]
>ふと思ったんですが、真偽値専用のifは関数として
>定義出来そうな気がしますね。とりあえず、なんか関数を
>でっちあげて、それで誤魔化しときましょうか。 < 誰を?

それがいいですね.統一性は維持して欲しいと思います.

>これもリストを使えばいいのではないでしょうか。
>if (cond) then [foo] else [bar]

Lispみたいに
if (cond) [then] [else]
としてしまうのもありかと.


> 実はSoopyでは、リストは遅延評価されます。
なるほど.アンリスト化(?)する時に評価されるわけですね.

ところでリストの要素を先頭から順番に全て取り出すメソッドがあると便利かと思いました.
headだと先頭の文しか評価されないので.
関数だとこんな感じ? ↓


progn = {arg:[lst];
do:[
if (lst length == 1) {
true: lst head;
false: progn (lst tail);
}
];} eval;



>なかなか日本語で参考になりそうなところが少なくて。
http://www.fan.gr.jp/~ring/doc/elisp-manual/elisp_toc.html#SEC_Contents
リファレンスぐらしか見当りませんねぇ.
チュートリアルが欲しいw

>もし、eclipseさんが作って下さったら、非常にうれしいです。
昨日少しやってみたんですが… 思ってた以上に茨の道です.
とりあえずいろんな〜-mode.elとリファレンスを漁りながら地道に作っていこうかと思います.


(randyさん)
>この掲示板が気に入ったので、つい長居し過ぎてしまったかな?
>私は全然かまわないのですが、成瀬さんに迷惑でしょうね。

(成瀬さん)
>わたしも全く迷惑なんてことはありませんよ。
>もともと特に話題を決めた掲示板というわけでもありませんしね。

あー… 余計なこと言っちゃったかなぁ(^^;
二人ともOKならここを利用させてもらいますか.

ちなみに randyさん = Soopyの中の人 だからこそ思ったことです.
例えばsoopyのことで誰かからrandyさんに質問が来て,そのことについてはこの掲示板で既に書いてあるっていう場合.
公式ページにあればそのページを見ろや,で終わるけど〜って.
でもここに書かれたことを公式ページ(wiki)に移動させれば済むことですよね.
手間がちょっとかかるけど.


>SAXやDOMを使ったってできますから、必ずしも必要ではないと思います。
>ただ、テンプレートドリブンなのはおもしろいですし、(わたしはXSLT以外にその手のものに触ったことないので)
>それに付随したXPointerやXPathあたりの香りとかはおもしろいな〜と。
要勉強キーワード頻出w
  【Re:76】 randy(Soopyの中の人) 2004年03月15日(月) 22時42分JST-9 【修正】
[ ac5yAxS6HvA ]
> 仙台駅東口がミニ秋葉原化しててなかなかいい感じ。SofmapやさくらやにつづいてLaoxが撤退したのはあれですが。
仙台。。。たまに買い物に行くなぁ。。。新幹線で30分くらい?
17インチの液晶(応答速度は知らない)でFF XIやってますが、
特に困ることはないです。アクションゲームだとどうだかはわかりませんが。

> わたしは、case(match)は今のifをそのまま変える〜というイメージだったのです。
> ただ、caseはC言語のイメージがあるので、それと区別する意味で、
> 「match」を使った方がいいかな、とも。
私も今のifを名前だけ変えるつもりでした。
あと個人的には、caseだと、Standard ML、matchだとOcamlっていうイメージですね。
それと、caseはPascal、switchがC/C++ってのもありか。

> そういえば、このforの場合iはグローバルな変数になってしまいますよね。
> これをローカルなものにすることはできないのでしょうか。
う。痛いところを突かれた。。。
そうなんですよね。そこが問題です。
まあ、変数はつねに宣言して使うもの、ということにして、


{
i: 0; # 変数の宣言

fun main(){
do: [
for2 [i=0][i < 10][i=i+1][hogehoge];
];
};
} main();


ってな感じで使ってもらうとか。。。うう。ちょっと苦しいかも。(^_^;;

> ここで話をしてても、他のsoopyユーザーの参考にはならないかな、というのはありますけれどね・・・。
soopyユーザー、、、っているのかなぁ?
二桁はいない気がする。
Soopy Wikiを使ってるところを2カ所ぐらい見かけたことはあるけど。。。

> せっかく気に入っていただけたのですから、使ってくださるとうれしいですよ。
> 話題が複数あっても混ざらないようにするためのスレッド式掲示板なわけですしね。
おお。ありがたいお言葉。
では、お言葉に甘えてここを使わせてもらいましょう。
でも、スレを別にたてたほうがいいですかね?
タイトルは「言語ヲタクたちの饗宴」とか。

> ところでリストの要素を先頭から順番に全て取り出すメソッドがあると便利かと思いました.
これは、前に書いたfor2のdo:部分

do: body each {arg:[dammy]; do: [];};

のようにeachを使うのでは駄目でしょうか?
それが駄目なら、map,foldl,foldrとかお好みにあわせて
取りそろえております。
http://soopy.sourceforge.jp/tutorial/soopycontent21.html#000110

> 昨日少しやってみたんですが… 思ってた以上に茨の道です.
> とりあえずいろんな〜-mode.elとリファレンスを漁りながら地道に作っていこうかと思います.
ありがたいです。
しかし、やはり茨の道でしたか。。。
ちょっと勉強した感じでは、仕組みを理解するまでが時間かかりそうですよね。

> でもここに書かれたことを公式ページ(wiki)に移動させれば済むことですよね.
> 手間がちょっとかかるけど.
そこはそれ、Wikiですから誰がやってもいいというわけで、
ボランティア募集中〜。ってことにしておけば、寝てる間に
ページが整理されていたり、いなかったり。(^_^)


C言語風ifですが、もう少し考えてみます。
で、一番の問題は名前ですね。
ifはすでにあるので、別の名前というと、、、何がいいでしょう?
あと、最初からライブラリ関数として、

if2(cond)[
then
][
else
];

みたく書けてしまうと、「なんでここだけ[]なんだ?
統一されていないなぁ。」とかいう人が出てくる、という罠がありそう。
  【Re:77】 成瀬ゆい 【HOME】 2004年03月16日(火) 03時32分JST-9 【修正】
[ GDqzJTJswmI ]
> でも最近のオフィススイートは結構重たいのが増えました。
近頃のオフィス系ソフトはファイルフォーマットがXML系に流れつつあるらしいので、
自分でその仕様にあうようにXMLを書けばよいかと(マテ

> でもここに書かれたことを公式ページ(wiki)に移動させれば済むことですよね.
ポイントと思われる話が出てきたら、適宜ざくっと引用して移動しておくことにしますか。
というわけでC言語風forの話を移動させてみました。

> まあ、変数はつねに宣言して使うもの、ということにして、・・・
変数を宣言してから使うのは、特に抵抗はないのですが〜、それはさすがにきついですね(笑
Perlだと、
my $i =3;
for(my$i =0; $i<10; $i++){print $i;}
print$i; #=>3
なので、それを真似して、
i = 3;
for2 [let i=0] [i < 10] [i = i + 1] [print i;];
print i; #=>3
とかできるといいのですけれど〜。
って、letは多重代入専用ですかね、、

そうそう、あと、
[i=0] nth 0; #=>i = 0
なのはバグ・・・ですよねぇ?

> soopyユーザー、、、っているのかなぁ?
soopyインタプリタを使ったことのある人、なら3桁いくと思いますよ。
実践的に使っている人はともかく(ぉぃ

> でも、スレを別にたてたほうがいいですかね?
いえ、いいですよ〜。
「よしなごと」のスレッドでよろしければ(笑
どちらにしろ、今レス数が77なので、100になったら新しいスレッド建てないといけませんしね。

> ifはすでにあるので、別の名前というと、、、何がいいでしょう?
if以外だと・・・whenとかですかねぇ。

> 「なんでここだけ[]なんだ?統一されていないなぁ。」とかいう人が出てくる、という罠がありそう。
結局それですよね^^;;
あちらを立てればこちらがたたず、と。
  【Re:78】 randy 2004年03月16日(火) 22時25分JST-9 【修正】
[ LZHfA06U/y. ]
> というわけでC言語風forの話を移動させてみました。
うあ。すみません。
成瀬さんのお手をわずらわせるつもりではなかったのですが。
でも、うれしい。

> って、letは多重代入専用ですかね、、
letをつかっても、ローカル変数にはならないんですよ。たしか。
単なる代入用なので。
こういうローカル変数まで定義しちゃうのは
Lispのマクロだと得意技なんですけど。。。
なんかいい手はないかなぁ。

> [i=0] nth 0; #=>i = 0
> なのはバグ・・・ですよねぇ?
あう!
バグです(T_T)
ソースは直しときました。(Version0.4.2も意外と早くリリースしないといけないかも)
とはいえ、他人にバグを指摘してもらうのは結構うれしい感じ。
いつもは自分でバグを見つけては、ちまちまつぶしてるだけなので。 < これは寂しいぞ〜。

> soopyインタプリタを使ったことのある人、なら3桁いくと思いますよ。
3桁いきますかね?
いってるといいなぁ。そういえば、「Matzにっき」のときには
一日で500人ぐらい来訪者がいたから、いくのかなぁ。

> if以外だと・・・whenとかですかねぇ。
whenか、それは思いつかなかった。でも、アリですね。

ちょっと、今日考えてみたC言語風ifとPascal風ifを貼ってみます。
C言語風がeclipseさんのアイデアに似せた(つもりの)やつで、
Pascal風が成瀬さんのアイデアに似せた(つもりの)やつです。

==C言語風if==

fun c_if(cond, then, else){
do: [
if(cond){
true: then each {arg:[dammy]; do: [];};
false: else each {arg:[dammy]; do: [];};
};
];
};

c_if(1 == 1)[
print "1 == 1."; println "SUCCESS.";
][
print "1 != 1."; println "Error.";
];

c_if(1 == 2)[
print "1 == 2."; println "Error";
][
print "1 != 2."; println "SUCCESS";
];




C言語風はわりと普通。


==Pascal風if==

fun p_if(cond){
do: [
if(cond){
true: {
then: {
arg: [then_body];
do: [
{
else: {
arg: [else_body];
do: [
{
end: nil;
};
];
} eval;
end: then_body each {arg:[dammy]; do: [];};
};
];
} eval;
else: {
arg: [else_body];
do: [
{
end: nil;
};
];
} eval;
end: nil;
};
false: {
then: {
arg: [then_body];
do: [
{
else: {
arg: [else_body];
do: [
{
end: else_body each {arg:[dammy]; do: [];};
};
];
} eval;
end: nil;
};
];
} eval;
else: {
arg: [else_body];
do: [
{
end: else_body each {arg:[dammy]; do: [];};
};
];
} eval;
end: nil;
};
};
];
};

#### test1 ####
p_if(1 == 1) end;
p_if(1 != 1) end;


#### test2 ####
p_if(1 + 1 == 2) then [
print "1 + 1 == 2."; println " SUCCESS";
] end;

p_if(1 + 1 != 2) then [
print "1 + 1 != 2."; println " Error";
] end;


#### test3 ####
p_if(1 + 2 == 3) else [
print "1 + 2 == 3. else "; println " Error";
] end;

p_if(1 + 2 != 3) else [
print "1 + 2 != 3. else "; println " SUCCESS";
] end;


#### test4 ####
p_if(1 + 3 != 4) then [
print "1 + 3 != 4."; println " Error";
] else [
print "1 + 3 != 4. else "; println " SUCCESS";
] end;

p_if(1 + 4 == 5) then [
print "1 + 4 == 5."; println " SUCCESS";
] else [
print "1 + 4 == 5. else "; println " Error";
] end;



Pascal風のコードは結構めんどい。
C言語風のほうは、elseが必ず必要になってるのに、
Pascal風のほうは、いろいろ省略可能にしたせいもあるけど。

あと、Pascal風のほうに、elsifとか付け足そうと思ってるんですが、
これをやろうとすると、無茶苦茶複雑になってバグが取りきれない。。。
  【Re:79】 eclipse 【HOME】 2004年03月17日(水) 01時03分JST-9 【修正】
[ 2adF0rWtCng ]
> do: body each {arg:[dammy]; do: [];};
ああ,これがズバリそれだったのですか.
でも欲を言うと1メッセージで書きたいなぁ.というか読みたいなぁw
書くだけだったら自分で定義すればいいだけですが.

>ifはすでにあるので、別の名前というと、、、何がいいでしょう?
互換性は保たなくっちゃダメでしょうか.
既存の言語をやっている人はifが一番馴染易いと思います.
>if以外だと・・・whenとかですかねぇ。
whenはifのelse節が無いものとしてよく使われるし…

=ローカル変数について=
例えばレキシカルスコープを作る構文をlocalとすると,

local ([i = 0]) [
for [i = 0] [i < 10] [i = i + 1]
[println i;];
];

という文を以下のどっちかに変形してくれる関数が作れればいいんですが,

# その1
{i:0;
do:[
for [i = 0] [i < 10] [i = i + 1]
[println i;];
];} eval ();

# その2
{arg:[i];
do:[
for [i = 0] [i < 10] [i = i + 1]
[println i;];
];} eval 0;

その1はフィーチャーの動的定義ができないと無理ですね.
その2はLispのletはlambdaと等価っていうやつです.
なんかできそうな気がしなくてもないのですが…これにはマクロ必要かなぁ

>ちょっと、今日考えてみたC言語風ifとPascal風ifを貼ってみます。
お疲れ様です.
Pascal風が… 波打ってるよ!w

# soopy-wikiに勝手に不具合報告ページ作っちゃいましたっ(^^;
  【Re:80】 randy 2004年03月17日(水) 15時45分JST-9 【修正】
[ LZHfA06U/y. ]
> でも欲を言うと1メッセージで書きたいなぁ.というか読みたいなぁw
あらかじめ、何もしない1引数の関数do_nothingとか定義しておいて、
do: body each do_nothing;
みたくするとか。

> 互換性は保たなくっちゃダメでしょうか.
> 既存の言語をやっている人はifが一番馴染易いと思います.
これは、果たしてSoopyユーザは存在するのかしないのか、
というのが問題ですね。
誰も使っていなければあっさり変えてしまっていいのですが。。。

> ローカル変数
そうか。localみたいなのがあればいいんですね。
さっそく作ってみました。(eclipseさんのとは微妙に違いますが)
local自体は、結構短く書けました。



fun for(init, cond, step, body){
do: [
loop {
from: init each {arg:[dammy]; do: [];};
while: cond head;
step: step each {arg:[dammy]; do: [];};
do: body each {arg:[dammy]; do: [];};
};
];
};


fun local(vars, body){
var: [ns];
do: [
ns = vars + {do: body;};
ns eval();
];
};


i = 100;
j = 200;

local {i: 0; j: 0;}[
for [i = 0][i < 10][i = i + 1][
println i;
print " ";
for [j = 0][j < 10][j = j + 1][
print j " ";
];
println "";
];
];

print "i = "; println i;
print "j = "; println j;



こんなんでどうでしょう?


> Pascal風が… 波打ってるよ!w
これ書いてる間は、脳みそが波打ってましたw


> # soopy-wikiに勝手に不具合報告ページ作っちゃいましたっ(^^;
あ。これは欲しいですね。
前からあったほうがいいかなぁ。と思いながら
どうせ誰もバグ報告なんてしてこないし、と油断してました。(^_^;
  【Re:81】 成瀬ゆい 【HOME】 2004年03月17日(水) 23時42分JST-9 【修正】
[ GDqzJTJswmI ]
> いつもは自分でバグを見つけては、ちまちまつぶしてるだけなので。 < これは寂しいぞ〜。
あぁ、わかります〜。
特に「明らかにみんなこのバグ気づいてるでしょっ!」ってバグを自分で見つけると悲しいですよね。
みんな気づいていて教えてくれなかったのか、使ってないのか・・・、と。

> 3桁いきますかね?
このスレッドのはるか前辺りでeclipseさんが教えてくださった2ちゃんねるのスレッドでもsoopyの名前はでてきますしね。
言語オタクの気のある人には触ったことのある方も結構いるのでは。

> whenか、それは思いつかなかった。でも、アリですね。

> whenはifのelse節が無いものとしてよく使われるし…

確かにwhenはelseの無いifとして使われるんですよねぇ。
elseが必須なのだから、if2とするのもありのようにも感じますけれど〜、
互換性を崩してでもifをこっちで使った方がいいようにも感じますね。
既存のスクリプトのほぼ全てに影響しそうなのが悩みですが・・・。

っと、これって引数の方をチェックすれば並存できますよね?
isList?とか使って・・・、ごめんなさいサンプルはとりあえず略。

とりあえず、p_ifはこうするとちょっと見やすくなるでしょうか・・・なってないかも。
fun p_if2(cond){
 var: [_else_nil, _else_do];
 do: [
  _else_nil = {
   arg: [else_body];
   do: [
    {
     end: nil;
    };
   ];
  };
  _else_do = {
    arg: [else_body];
    do: [
     {
      end: else_body each {arg:[dammy]; do: [];};
     };
    ];
   };
  if(cond){
   true: {
     then: {
       arg: [then_body];
       do: [
        {
         else: _else_nil eval;
         end: then_body each {arg:[dammy]; do: [];};
        };
       ];
      } eval;
     else: _else_nil eval;
     end: nil;
    };
   false: {
     then: {
       arg: [then_body];
       do: [
        {
         else: _else_do eval;
         end: nil;
        };
       ];
      } eval;
     else: _else_do eval;
     end: nil;
    };
  };
 ];
};
どんなメッセージを受け取っても自分を返すオブジェクトとかがあるとcond==trueの時とか大幅に楽になるように感じるのですが・・・。
{arg:[cond];do:[if(cond){default:self;};];};
とかやっても無理なんですよね、

> あと、Pascal風のほうに、elsifとか付け足そうと思ってるんですが、
elsifまで使うのだったらcase/matchを使え、という感じが・・・って、そういうものでもありませんか。

> 例えばレキシカルスコープを作る構文をlocalとすると,
それはいいですね、なかなか使いやすそうです。

> さっそく作ってみました。(eclipseさんのとは微妙に違いますが)
ネームスペースの和を使うとは・・・。
鮮やかですねぇ。
  【Re:82】 randy 2004年03月18日(木) 22時20分JST-9 【修正】
[ LZHfA06U/y. ]
> 特に「明らかにみんなこのバグ気づいてるでしょっ!」ってバグを自分で見つけると悲しいですよね。
> みんな気づいていて教えてくれなかったのか、使ってないのか・・・、と。
Soopyの場合は、「みんな使ってない」せいだろうなぁ。(^_^;

> 既存のスクリプトのほぼ全てに影響しそうなのが悩みですが・・・。
「既存のスクリプト」がどれだけあるかですね。
自分が書いたものなら、ifをcaseとかに変換するのは
問題ないのですが、万が一、誰かがSoopyを使って
なんかプログラムを書いていたら。。。
Soopy Wikiのほうで、「いずれifを変更する」という告知をして
様子をみてから、変えちゃうとかですかね。

> とりあえず、p_ifはこうするとちょっと見やすくなるでしょうか・・・なってないかも。
うわ。あのうねうねを読解して整理したんですか!
後からみたら、自分でも何だかわかんなくなりそうなソースなのに。。。

そういえば、selfとかthisにあたるものってなかったんだったっけか?
一度も考えてないということはないはずなので、
実装が難しそうだったんだろうか?
もう一度、考えてみます。

=lambda=
今日、トイレでふと思いついたやつ↓。
無名関数をつくる関数、ってことですね。



fun lambda(args, body){
do: {arg: args; do: body;} eval;
};


sq = lambda[x][x * x];
print "sq 9 = "; println(sq 9);

  【Re:83】 午後の紅茶b 2004年03月18日(木) 23時35分JST-9 【修正】
[ rRvmEHBZLrw ]
変換スクリプトを作って配布するのは無しですか?
  【Re:84】 eclipse 【HOME】 2004年03月19日(金) 00時58分JST-9 【修正】
[ 2adF0rWtCng ]
>あらかじめ、何もしない1引数の関数do_nothingとか定義しておいて、
>do: body each do_nothing;
soopyでは組み込みオブジェクト(Listとか)を触ることってできないんですか?
MyList = List + {fun myMethod...};
みたいなことができれば…非常に嬉しいですw


=if=
>成瀬: っと、これって引数の方をチェックすれば並存できますよね?
>randy: Soopy Wikiのほうで、「いずれifを変更する」という告知をして
>b: 変換スクリプトを作って配布するのは無しですか?
とかやれば十分でないかと.

>成瀬: とりあえず、p_ifはこうするとちょっと見やすくなるでしょうか・・・なってないかも。
>randy: うわ。あのうねうねを読解して整理したんですか!
すご.私は見た瞬間に読む努力を放棄しましたがw


=local=
>さっそく作ってみました。(eclipseさんのとは微妙に違いますが)
>local自体は、結構短く書けました。
おおっ こんなに綺麗に解決できるのか…流石です.


=lambda=
>無名関数をつくる関数、ってことですね。
ああっ それ…私が思いつきたかったw
localにしろlambdaにしろ,こういうことをシンプルにできちゃう言語が欲しかった!
soopyいいです〜 今のところOOPLで一番好きです.
  【Re:85】 randy 2004年03月19日(金) 22時44分JST-9 【修正】
[ LZHfA06U/y. ]
> 変換スクリプトを作って配布するのは無しですか?

ifをcaseに変換ってことですよね。
そういうのは、sed向きかな。
って、sedってWinじゃ、あまり一般的でない?
でなければ、perlかな。え? Soopyでやれ、って。(^_^;

> soopyでは組み込みオブジェクト(Listとか)を触ることってできないんですか?
うーん。いまのところ、無理です。
Soopyは結構、静的な言語をねらっているので。。。
いずれ、コンパイラ(Cへのトランスレータ)でも作ろうかと
野望をいだいているので、あまり動的にしたくないというか。

=if=
やっぱり、告知して変更するのがいいかなぁ。
そういう方向に傾きつつある。>自分

> soopyいいです〜 今のところOOPLで一番好きです.
ありがとうございます〜。
半分、関数型の血が流れているところが
eclipseさんにはあっているのかもしれませんね。
  【Re:86】 午後の紅茶b 2004年03月20日(土) 00時01分JST-9 【修正】
[ rRvmEHBZLrw ]
>> 変換スクリプトを作って配布するのは無しですか?
> sed向きかな。> sedってWinじゃ、あまり一般的でない?>でなければ、perlかな。え? Soopyでやれ、って。(^_^;

です( ̄ー ̄)
ただの傍観者なんであまり押せませんが
さらなるベッカムハムの人は別所さん別解としてモジュールかませば古い構文でも使える、トカ
Perl的に書けば、use Ancient; みたいな。
  【Re:87】 成瀬ゆい 【HOME】 2004年03月20日(土) 04時03分JST-9 【修正】
[ GDqzJTJswmI ]
> うわ。あのうねうねを読解して整理したんですか!
しばらく眺めていたら、ふと何をやっているかわかりましたよ。
ようはメッセージを受け取って、condに応じて本文を処理しつつ、いらないものを捨てているのですね。
本当は、if-elsif1-elsif2-elseを、
match(true){
  [if] head: ...;
  [elsif1] head: ...;
  [elsif2] head: ...;
  [else] head: ...;# true: ...;かな
}
とか変形できるとよいのでしょうが・・・。

そうそう、わたしはcaseでなく、if->match派です(何

> そういえば、selfとかthisにあたるものってなかったんだったっけか?
明示的なオブジェクトというものがないので、selfがどれをさすか明確になりづらい、とかですかねぇ。
あと、すぐ外側のnamespaceを指すとしても、それではこんなケースでは使えない、とか。
{arg:[cond];do:[if(cond){default:self;};];}; # selfはif本文のこと

> 無名関数をつくる関数、ってことですね。
うわぁ、シンプルですね・・・。
こういうのが自然にできる言語体系というのは凄いですね。

> すご.私は見た瞬間に読む努力を放棄しましたがw
うまく要所要所を色付けしてくれるエディタとかを使って見れば、もっとわかりやすくなるような気がしますよ。

そもそも、何かもっと綺麗に書く方法があるような。

> え? Soopyでやれ、って。(^_^;
正規表現が必要ですねw
  【Re:88】 randy 2004年03月20日(土) 11時30分JST-9 【修正】
[ LZHfA06U/y. ]
> 別解としてモジュールかませば古い構文でも使える、トカ
なるほど。
こんな関数↓を定義しとけばいいのかな。


fun if(cond, body){
do: match cond body;
};



> そうそう、わたしはcaseでなく、if->match派です(何
じゃ、matchで。(^_^)
単にcaseほうが1文字少ないから、というのが理由なので、
それほどこだわりはないです。

> 明示的なオブジェクトというものがないので、selfがどれをさすか明確になりづらい、とかですかねぇ。
これですね。たぶん。
やたらネームスペースが多いので、selfを使える場面が
意外に限定されそうな感じなのが問題なのでしょうね。

> うわぁ、シンプルですね・・・。
文法を考えているときに、シンプルな構文を突き詰めていったら、
実は結構、柔軟で強力なものが出来上がったという感じです。

> そもそも、何かもっと綺麗に書く方法があるような。
う。ありそうな気はする。。。
最近、花粉症で脳みそがくさってるから、
あまり綺麗なコードが書けない、、、と言い訳しておこう。

> 正規表現が必要ですねw
Soopyに正規表現ってあったほうがいいと思いますか?
今、迷ってるんですけど、正規表現が使える言語なんて
たくさんあるし、別にSoopyでやらなくても、とか思ってたり。
Soopyは、正規表現が使える言語とは、方向性が
かなり違うと思ってるので。
  【Re:89】 randy 2004年03月20日(土) 17時47分JST-9 【修正】
[ LZHfA06U/y. ]
> こんな関数↓を定義しとけばいいのかな。
よく考えたらこの関数、動きませんね。あうぅ。(>_<)
  【Re:90】 eclipse 【HOME】 2004年03月20日(土) 22時18分JST-9 【修正】
[ v9VgiqxZTm2 ]
> Soopyは結構、静的な言語をねらっているので。。。
そうなのですか… ちょっと意外でした。

> いずれ、コンパイラ(Cへのトランスレータ)でも作ろうかと
おぉ、それは実用的ですね。

> 半分、関数型の血が流れているところが
私にとっては概念的な美しさ≒統一性が言語の中で一番気になるところです。
Lispを初めて学んだ時には感動したものです。
こんなに綺麗な言語があったのかと。
なぜに世間では汚い言語がこんなにも普及しているのだと。
あれからけっこう経ちますが未だにLispでまともなプログラムを作った事が無い。
その事実の裏側が普及しない原因なのですかねぇ。
Soopyのメッセージモデルやリスト+ネームスペースの表現力を知った時には
Lispに触れた時と似たような感動を覚えました。
シンプルさと表現力の共存。これがポイントですかね。


> selfがどれをさすか明確になりづらい、とかですかねぇ。
オブジェクトや関数のリテラル表現を許すと現れる問題ですね。
レキシカルスコープと概念的なスコープのどちらに属すべきかという。
この問題は私も考えた事あるんですが…結論出なかったですw


> じゃ、matchで。(^_^)
私もどちらかというとmatchの方が好きです。
理由は見た目と、パターンマッチという単語と対応するのでわかりやすいという事です。


> Soopyに正規表現ってあったほうがいいと思いますか?
それはあるに越した事はないですがw
「作ってくれよ」という声が出てきてから考えても遅くないかと。


> Soopyは、正規表現が使える言語とは、方向性がかなり違うと思ってるので。
具体的な応用としてはどんなものを想定しているのでしょうか。
使い捨てスクリプトとかGUIアプリとか計算用とか…
  【Re:91】 成瀬ゆい 【HOME】 2004年03月21日(日) 05時18分JST-9 【修正】
[ GDqzJTJswmI ]
> いずれ、コンパイラ(Cへのトランスレータ)でも作ろうかと
期待してます・・・w

> Soopyに正規表現ってあったほうがいいと思いますか?
なんともいえませんが、文字列処理をやるときには正規表現はないと困りますね。
逆に言いますと、正規表現がないと文字列処理に制限ができてしまうように感じます。
文字処理分野を狙っていないのなら必要ないとは思いますけれど、

> 理由は見た目と、パターンマッチという単語と対応するのでわかりやすいという事です。
ですよね〜。
あと、caseはswitch-caseやcase-whenのイメージがあって、パターンマッチのイメージがわきにくい、というのも。

> レキシカルスコープと概念的なスコープのどちらに属すべきかという。
レキシカルの方がいいように感じますねぇ・・・。
で、レキシカルスコープだと実用性に何があると、、、

でも、self無しでどんなメッセージを受け取っても自分を返すオブジェクトって作れます?
作れるのなら必要なさそうですが・・・
  【Re:92】 randy 2004年03月23日(火) 20時26分JST-9 【修正】
[ LZHfA06U/y. ]
> 具体的な応用としてはどんなものを想定しているのでしょうか。
> 使い捨てスクリプトとかGUIアプリとか計算用とか…
あ〜、何でもできる(速度重視のものを除く)「汎用プログラム言語」を
狙っています。
まぁ、実際は、こんな言語作ってみたい、という個人的な願望を
満たすために作られているので(個人で作っている言語って
多かれ少なかれ、そうじゃないのかなぁ)、具体的な応用は
眼中にないというのが、正解なのかも...w


>> 理由は見た目と、パターンマッチという単語と対応するのでわかりやすいという事です。
>ですよね〜。
やっぱり意味的にはmatchのほうがわかりやすいですね。

=正規表現=
どうしようかなぁ。
実装するとなると結構時間を喰いそうで(数ヶ月から半年ぐらい?)、
やるとしても花粉症の時期をすぎないと頭が働かなくて無理だなぁ。
一年のうち半年は花粉症です。(>_<)

=self=
上に同じく、花粉症で全然考えがまとまらない。。。うぅ。
8月頃になったら改めて考えます。(覚えていたら。。^_^;)

>管理人さん
ところで、この掲示板はRSSに対応する予定はないのでしょうか?
対応していただくと、幸せになる人が増えるかも。。。(自分だけ?)
  【Re:93】 成瀬ゆい 【HOME】 2004年03月24日(水) 03時03分JST-9 【修正】
[ GDqzJTJswmI ]
== 正規表現
正規表現は鬼車ベースか、
http://sakura-editor.sourceforge.net/cgi-bin/cyclamen/cyclamen.cgi?log=dev&tree=r3410
を使うか、コマンドラインからPerlに投げるか(ぇ

わたしもなんか花粉症で調子が(==
Mireille2が進まないです・・・(これは関係ないかも

== self
とりあえず、Wikiページを備忘録代わりに作ってみましたw

== RSS
その手のものにMireille2で対応する予定ではあります。
RSS1.0かRSS2.0かAtomか、まだ見ぬ何かかは未定ですけれど。

ま、今でもLastModified更新チェックには対応しているので、
わたし自身は(更新があれば内容にかかわらず読むので)それで間に合っていたりも。

とはいえ、これからの掲示板システムに必要な機能だとは思っています。
  【Re:94】 randy 2004年03月25日(木) 20時39分JST-9 【修正】
[ LZHfA06U/y. ]
> 正規表現は鬼車ベースか、
正規表現は出来れば一度自分で作ってみたいなぁ、なんて思ってました。
それにSoopyの文字は内部ではアレなので。。。普通の文字コードようのを
移植できるかどうかが問題。。。

> わたしもなんか花粉症で調子が(==
> Mireille2が進まないです・・・(これは関係ないかも
いや、それは、たぶん、絶対、花粉症のせいですw
花粉症のときって、やる気がおきないんですよね。
いや、ほんと、そういう病気なのよ。

=self
う。忘れる自由が奪われた〜 (^_^;

=LastModified
って、知らなかった。RSS自体、雑誌で最近読んだから知っただけだし。<無知
  【Re:95】 成瀬ゆい 【HOME】 2004年03月25日(木) 23時36分JST-9 【修正】
[ GDqzJTJswmI ]
== 正規表現
たしかに正規表現を自分で実装してみるのはわたしも夢ですねぇ・・・いつになるかわかりませんけれど。

soopyの場合、文字エンコーディングはTRONコードにほうりこむ方式ですっけ?
TRONコードだと文字の正規化とかが問題になりそうですね、、

== 花粉症
おぉ、Mireille2がすすまないのは花粉症のせいだったのですね。
いつになったら直るのかな〜来年の春まで継続してたらどうしましょ(ぇ

== s/if/match/g
ifは予約語からはずさない方がいいのではないでしょうか。
新たなif風の構文を作るかもしれないわけですし。
本当にif文を新たに作るかわからないとしても、当分は予約語のままにしておいた方がいいように感じます。

== RSS/LastModified
RSSの方が内容自体を配信できますから、その点はいいですよね。
応用すれば、Mireilleをブラウザでなくリッチクライアントで見れるように、というのも可能になるな、とも。

WWWCやWWWD、あとRegnessemやMozillaあたりについているような、
HTTP Last-Modifiedヘッダをみて更新がされているか否かを判定することはできるのですよ。
Mireilleのあまり知られていないけれど、知ると重宝する機能の一つだったりw
  【Re:96】 randy 2004年03月28日(日) 10時02分JST-9 【修正】
[ LZHfA06U/y. ]
> TRONコードだと文字の正規化とかが問題になりそうですね、、
TRONコードだと、漢字の1バイト目かどうかを調べて、
次の処理を変えるとかいうのがなくなって、幸せなのでは、とか考えてたり。。。

> 本当にif文を新たに作るかわからないとしても、当分は予約語のままにしておいた方がいいように感じます。
ふむふむ。一理ありますね。
わたしはifはユーザに好きなように定義してもらえるように解放しようかと
思ってました。
前に書いた、c_if, p_if みたいなのをライブラリとして用意しておいて、
好みに応じて、 if = c_if あるいは、 if = p_if とかして使ってもらおうかと。

> WWWCやWWWD、あとRegnessemやMozillaあたりについているような
へ〜。Mozillaも対応してるのですか。
今度、試してみよう。
  【Re:97】 成瀬ゆい 【HOME】 2004年03月28日(日) 18時56分JST-9 【修正】
[ GDqzJTJswmI ]
> TRONコードだと、漢字の1バイト目かどうかを調べて、
> 次の処理を変えるとかいうのがなくなって、幸せなのでは、とか考えてたり。。。
あれ、TRONコードってエスケープ式じゃありませんでしたっけ?
4バイト固定で扱うのでしょうか。

あとは同一の文字が複数のTRONコードを持っている問題とかはどうなのでしょうか。
例えば「亜」は1-3021と2-2464と8-2373を持っている、というような。
正規化しようとしなければ問題ないのですかね。

> わたしはifはユーザに好きなように定義してもらえるように解放しようかと
んーむ、それも一理あるように感じるのですが、
if文のような基本的な文を開放すると、コードが読みづらくなりません?
  【Re:98】 randy 2004年03月29日(月) 19時23分JST-9 【修正】
[ LZHfA06U/y. ]
> あれ、TRONコードってエスケープ式じゃありませんでしたっけ?
あれ、そうでしたっけ? 忘れましたw
内緒ですが、実はSoopy内部では文字は32ビットです。
これを公言すると、それだけでひいてしまう人がいるんじゃないかと思って、
内緒にしてるんですが。。。(^_^;
というわけで、漢字だろうがハングルだろうが、1文字は文字型ひとつで
扱えます。

> 例えば「亜」は1-3021と2-2464と8-2373を持っている、というような。
> 正規化しようとしなければ問題ないのですかね。
お。詳しいですね。わたしはあまり詳しいわけではないので、
深くつっこまれると、ボロがでちゃう〜。
正規化するとすれば、テキストを読み込むときにすればいいのかな。。?

> if文のような基本的な文を開放すると、コードが読みづらくなりません?
うーん。なるほど。。。
ifはSoopyでは、基本的な文ではない(なくなる)、という方向なんですが。。。

結局、構造化プログラミング(というのか?)では、
 1.逐次実行
 2.繰り返し
 3.分岐処理
の3つがあればいいわけで、C言語などで、分岐処理が
ifとswitchにわかれているのは、たんなる構文糖ですよね。
Soopyでは、あくまでシンプルさを追求しているので、
分岐処理は2種類もいらない、ってことでしょうか。
(って、今考えたw)
  【Re:99】 午後の紅茶b 2004年03月30日(火) 01時12分JST-9 【修正】
[ rRvmEHBZLrw ]
あと一つ


>内部では文字は32ビットです。

いいないいな。
今時、スクリプトのファイルサイズはさほど重要でもないし。
  【Re:100】 成瀬ゆい 【HOME】 2004年03月30日(火) 03時18分JST-9 【修正】
[ GDqzJTJswmI ]
> 内緒ですが、実はSoopy内部では文字は32ビットです。
いや、いいんじゃないですか?
UTF-8なんて半端なことをせずに、32bitにしてしまたほうが綺麗だな、と。
あと、詳しくは知らないのですが、今時のコンピュータって32bitにしたほうが処理が早いのでしょ?
メモリ的には容量を食いますけれど。

マルチバイト文字でもちゃんと一文字として認識してくれるのはうれしいですねぇ。

> 今時、スクリプトのファイルサイズはさほど重要でもないし。
ファイルとしてはUTF-8とかShift_JISにしてしまうのでは。

TRONは、16bitであらわしたい時はエスケープ式になるのですよ。
32bitだとエスケープ無しになります。

> 正規化するとすれば、テキストを読み込むときにすればいいのかな。。?
保存する時や、検索する時とかに意識する必要がありますね。
もっとも、正規化はしない、というのも一つの決断かもしれません。
だけれど〜、それだと大文字セットを前提とした国際化でなく、
文字エンコーディング非依存の国際化 - CSIの方がいいかもしれません。
http://www.idg.co.jp/lw/news/back/index20011124_01_solaris.html
結局の所、TRONコードハードコーディングでも、Unicodeハードコーディングでも本質は同じわけで。

この辺の話は掲示板を作っている途中で色々調べまして、

> 結局、構造化プログラミング(というのか?)では、
関数指向の流れを汲むものとしては、それもありですね。

結局の所、構文糖をデフォルトで用意するか、しないか、と。
しなくてもいいような気はするのですが、似て非なる我流のifがでてくるとイヤだなぁ、ってのがありまして。

この記事スレッドNo.244は最大子記事数を超えているため、返信することはできません。

■■■■■■■
- Type: Mireille Default 1.2 -
- Airemix Mireille 1.2.19.67β -