08/01/24 07:51:21
なんでそんな伸びそうも無いものを。
>1 にネタ振りが出来ないようなら早晩落ちるぞ。
3:デフォルトの名無しさん
08/01/24 12:04:58
言語そのものは知らんが実装はガベコレだけ読んだな。
4:デフォルトの名無しさん
08/01/24 13:20:05
ioの構文、メッセージ機構はすごく興味あるんだけど
バインディング機構がヘボいから萌えない…
5:デフォルトの名無しさん
08/01/24 22:28:07
特殊形式に見えるものが普通のメソッドだったりするからメタプログラミングとかは結構できそうだな
文法もわりとわかりやすいな
6:デフォルトの名無しさん
08/01/25 03:22:30
このインターネッツ時代にわざわざ検索しにくい名前をつけんなと
7:デフォルトの名無しさん
08/01/26 17:04:19
>>5
それは良いけど、これはいただけない気が…
Range
v := "before"
f := method(arg, arg)
v println #=> before
0 to(10) foreach(v, v println) #=> 012345678910
v println #=> 10
8:デフォルトの名無しさん
08/01/27 23:15:50
(過去の)関連スレ
{_proto: プロトタイプベース・オブジェクト指向};
スレリンク(tech板)
9:デフォルトの名無しさん
08/02/03 10:14:47
>>6
io-language
iolanguage
で検索するよろし
10:デフォルトの名無しさん
08/02/03 10:18:52
>>7
Rubyのブロックと同じ問題ですなあ
11:デフォルトの名無しさん
08/02/03 10:42:51
v := "before"
が無くても同じ、これは嫌だな
Rubyのは1.9で直ってるんだよね
12:デフォルトの名無しさん
08/02/03 10:57:05
LLパトルロワイヤルスレから来ました
io-languageの話題はここでいいのかな・・・
まあいいや
io-languageでメッセージ?オブジェクトそのものを取り出すにはどうしたらいいんでしょ
Io> unko := Object clone do(puripuri := method("&&&" println))
==> Object_0x581898:
puripuri = method(...)
Io> unko puripuri
&&&
==> &&&
Io> unko puripuri slotSummary
&&& ←puripuriが実行されてしまう
==> "&&&": ←文字列にslotSummaryしてしまう
上記で、puripuriを取り出したいのですが・・・
13:デフォルトの名無しさん
08/02/03 10:57:55
> io-languageの話題はここでいいのかな・・・
>
> まあいいや
コピペ失敗 orz ここは読み飛ばしてください
14:デフォルトの名無しさん
08/02/03 11:01:52
unko getSlot("puripuri")
ってこと?
15:デフォルトの名無しさん
08/02/03 11:45:22
>>14
それだ!!!!1
ありがとうございました。
文字列で渡すのがなんか新鮮に感じた
16:デフォルトの名無しさん
08/02/03 19:40:17
何かよさげな言語の予感
17:デフォルトの名無しさん
08/02/03 19:58:23
>>7
v := "before"
f := method(arg, arg)
v println #=> before
Sandbox doSandboxString("Range; 0 to(10) foreach(v, v println)")
v println
スマートとは言い難いけど、Sandboxを使ってとりあえず回避。
18:7
08/02/03 20:39:23
>>17
Sandboxなんてあったのか…
あれから考えて、こんな風にやってみた。
うまくいっているようには見える。
scope := method(
expr := call message arguments first
context := Object clone
msg := message(do)
msg setNext(expr)
context prependProto(call sender)
context forward := method( self proto doMessage(call message clone do( setNext(nil) )) )
context doMessage(msg)
)
obj := Object clone
obj l := list(1, 2, 3)
obj f := method( scope( l foreach(v, v println) ))
chk := method( "[obj] " print ; obj slotNames print ; " [v] " print ; Lobby slotNames println )
obj f ; chk
scope( obj l foreach(v, v println) ) ; chk
obj l foreach(v, v println) ; chk
scopeブロック(?)内で self がいる(self l とする)ような仕様で良ければ forward メソッドの設定は省ける。
19:デフォルトの名無しさん
08/02/05 02:38:43
↓のみてて思ったんだけど、++とか--みたいな演算子って直接呼べないの?
URLリンク(blog.xole.net)
value := 0
value ++ := method(self = self + 1)
value -- := method(self = self - 1)
value ++ println
value -- println
結果はファイルから読み込むと何もでないんだけど、コンソール(?)からやるとなんか出力されるんだよね
> io
Io> value := 0
==> 0
Io> value ++ := method(self = self + 1)
==> method(...)
Io> value ++ println
==> 1
Io> value ++ println
==> 1
Io> value println
==> 0
なんでだろ?
あと、↓のにすると上手く動く。この違いがわからない...orz
value getSlot("++") setScope(value) call println
value getSlot("--") call println
20:デフォルトの名無しさん
08/02/05 03:07:40
>>19
selfに代入しても、元のが変わらんっぽい
Io> value := 0
==> 0
Io> value test := method(self = "banzai!")
==> method(
self = "banzai!"
)
Io> value test
==> banzai!
Io> value
==> 1
21:7
08/02/05 03:24:01
>>19
> value ++ println
これは、value ++(println) となって println は引数として扱われる。
んで、メソッドの側で仮引数を指定していないのでなにも起こらない。
コンソールで 1 が返ってくるのは、コンソールがメソッドの返値を表示するようになっているだけで、
println が表示しているわけではない。
> value ++ := method(v, self = self + 1)
とすれば何が起こっているかわかりやすいかも。
>>20
self はローカル領域オブジェクトのスロットなんじゃない?
変わる方がおかしいと思います。
22:20
08/02/05 03:41:13
Io> value := Sequence clone setItemType("float32") setEncoding("number") setSize(1)
==> 0.000000
Io> value ++ := method(self += 1)
==> method(
self += 1
)
Io> value ++
==> 1.000000
Io> value
==> 1.000000
やったー ++ できたよー orz
>>21
そっか、selfも単なるread onlyなスロットだからか・・・
23:20
08/02/05 04:18:45
Io> value := 0
==> 0
Io> value ++ := method(call sender setSlot("value", self + 1))
==> method(
call sender value := self + 1
)
Io> value ++
==> 1
Io> value
==> 1
先生!receiverの名前を得る方法はないんでしょうか!
どうでもいいけど、referenceがページ分けされてないので検索しずらいです('A`)
URLリンク(www.iolanguage.com)
24:7
08/02/05 04:42:21
>>23
リファレンス読むと、
call message previous name
で、出来そうだけど実際には previous が無い模様。
ソース読むと、それっぽい実装はあありました。
使えるようになれば、value ++ とか出来そうですね。
ただ、>>21の問題もあるので細工がいりそうですけど。
>検索しずらいです('A`)
以前のJavaScript使った妙なやつよりはマシな気がする。
25:20
08/02/05 05:25:05
絶対にスマートにできる方法があるはず!と思ってソース見たら
Number.c の Number のデータ部分に代入しているのが(DATA(self) = しているところ)、
IoNumber_rawClone、IoNumber_newWithDouble_、IoNumber_copyFrom_ くらいしかなくて、
IoNumber_rawClone は、Clone用、
IoNumber_newWithDouble_は、内部のIoState用、
IoNumber_copyFrom_は、組み込まれてないww(たぶん内部用)
オワタ\(^o^)/
Number copyFrom メソッド実装汁!って本家に言っとくか、パッチなげるかだなw
26:20
08/02/05 05:26:36
ああ、言い忘れた。一応、IoNumber_readFromStream にもあったから、Stream使ったらいけるかも
27:20
08/02/05 06:14:24
連投スマソ。
>>26 のStream関連はまだ使われてないようでした orz
>>24
確かに call message previous で行ける!と思いましたが、
IoMessage_previous の中の実装が ifdef で外されている上に、
Ioのメソッドとして組み込まれてないですね。
28:デフォルトの名無しさん
08/02/05 13:10:12
チラシの裏です。
Windows版でコンパイルしたくなって四苦八苦してたんですが、
downloadページで配布されている Io-2008-01-20.tar.gz が、
ShellExecuteのための shell32.lib がリンクされてねえとか、setenvがねえとか、
OS依存なエラーでwin32環境でコンパイルできなくて、どうなっとるねん!!1
エラーつぶしているうちに、Changelog 見たらWindows関連部分が Fix されてるっぽくて、
URLリンク(www.iolanguage.com)
↑見たら直ってて、俺の時間返せー!!! って感じです・・・ orz
とりあえず、git落として最新版ダウンロードしたお
29:デフォルトの名無しさん
08/02/05 18:18:29
最近のバージョンって do( とかで改行すると、エラーで続きが入力できない。
30:19
08/02/06 01:22:28
なるほど、selfはローカルのslotかあ。
というか、前回の>>19で書いた++は1の評価を返してるだけ?
value := 3
value setSlot("++", method((self + 2) println))
value ++ // 5
やたー
ということは...ここは>>19のクロージャか!!w
value := 6
value ++ := block(
block(
value = value + 1
call activated
)
) call
(value ++) call call call call
value println
全然答えじゃねえorz
31:デフォルトの名無しさん
08/02/06 01:48:38
>>30
解決になっとらんでワロタ
32:7
08/02/06 03:16:47
無理矢理解決してみた。
v := 0
inc := method(
res := nil
recv := call target
cntxt := call sender
cntxt foreachSlot(name, value,
if (recv == cntxt getSlot(name),
res = cntxt setSlot(name, cntxt getSlot(name) + 1)
)
)
msg := call message
right := msg argAt(0)
msg setArguments(list())
msg setNext(right)
res ++ := Lobby getSlot("inc")
res
)
v ++ := getSlot("inc")
v println
(v ++ ++ ++ println)
v println
33:7
08/02/06 03:19:22
>>32 書いてて気づいたんだけれど
1 + ; 2
は、 1 + 2 と解釈されるのね。
改行も同様につながってしまう。
そのせいで右辺のメッセージのごまかしが完全じゃない。
34:デフォルトの名無しさん
08/02/06 03:55:34
俺も...と思ったけど、ダメだったorz
value := 0
value ++ := method(
call message setName("call")
call sender setSlot("self", self + 1)
)
(value ++) println //1
value println // 0
35:デフォルトの名無しさん
08/02/08 14:08:19
++の話題、Smalltalkスレで聞いたら、同じような力技でしたw
アラン・ケイも認めた!Ruby>>>>>Smalltalk
スレリンク(tech板:169番)
> >>165
> やっつけですが、Squeak Smalltalk で。
>
> Object >> inc
> | sender index |
> sender := thisContext sender.
> index := (sender method at: sender pc - 2) \\ 16 + 1.
> ^sender tempAt: index put: (sender tempAt: index) + 1
>
> | a b before after |
> a:= 1. b := 2.
> before := {a. b}.
> a inc. b inc.
> after := {a. b}.
> ^{before. after} "=> #(#(1 2) #(2 3)) "
36:デフォルトの名無しさん
08/02/08 14:19:36
>>35
Io もレシーバが代入されているスロット名を知る手段があればできるんだけどね。
37:デフォルトの名無しさん
08/02/09 07:44:21
つーか何が特徴なの?って物ばっかりだなこの手のは
++にしてもただの欠陥だし
無理矢理処理系の裏技使って解決しました!
ってまるっきりバカに見える
38:デフォルトの名無しさん
08/02/09 08:08:10
> つーか何が特徴なの?って物ばっかりだなこの手のは
それは、あなたがバカなだけ
> ++にしてもただの欠陥だし
それは正しい
> 無理矢理処理系の裏技使って解決しました!
> ってまるっきりバカに見える
スマートではないのには同意。
しかし、どの言語にもスマートにできないものはある。
>>37の使っている言語にも苦手な処理はあるだろう?
39:デフォルトの名無しさん
08/02/09 08:23:45
>>37 はスマートにディップスイッチでバイナリを直打ちしている
40:デフォルトの名無しさん
08/02/09 08:24:26
なんだこいつ
41:デフォルトの名無しさん
08/02/09 08:32:58
>>38
これはこれは
別に>>38を名指しでバカって言ったわけじゃないよ
リトマス試験紙にするつもりは無かったのだが
それと、欠陥なら直せば?
42:デフォルトの名無しさん
08/02/09 09:57:51
欠陥ではなくセマンティックスの違いでしょう。
変数を箱のようなものと捉えるか、ラベルのようなものと捉えるか、という。
43:デフォルトの名無しさん
08/02/09 12:52:34
マクロを導入すればいいのに。それで解決する問題だ。
44:デフォルトの名無しさん
08/02/09 13:12:13
>>43
あーそーゆーことね。
45:デフォルトの名無しさん
08/02/09 17:38:49
まー、Ioはマクロがなくてもこれだけできる!みたいなところはある
というかマクロも実装できそうだがどうか
46:デフォルトの名無しさん
08/02/10 15:55:43
っていうか、
>>41
>それと、欠陥なら直せば?
あなたの使ってる言語はすぐ直せるの欠陥?
だいたいの場合、欠陥があったら言語のコアな部分を弄らないといけないと思うんだけど、そうじゃないのが現実なんだろうか...?
small talkの例がでたけど、ioとかこの辺の言語は、その欠陥をなんとかできそうな感じなんだよな。
だからみんな魅力を感じてるんじゃないかと。
47:デフォルトの名無しさん
08/02/10 16:08:46
++関連見てきた。
スレリンク(tech板:559番)
なんかすげー理解が広がリングwww
これ見ると言語実装論みたいのが分かって面白いわ
あと、smalltalkの実装も面白い
48:デフォルトの名無しさん
08/02/19 23:56:58
IoでObjective-Cの文法を導入する試み。
こういう「クレージー」なことができる言語は素晴らしい。
が、日常的に使いたいかどうかはまた別問題である。
URLリンク(www.rubyist.net)
49:デフォルトの名無しさん
08/03/05 08:42:59
Rangeってどうすれば使えるのでしょうか?
何か準備がいるのかな。
Io 20070410
Io> Range
Exception: Object does not respond to 'Range'
---------
Object Range Command Line 2
50:デフォルトの名無しさん
08/03/05 09:11:29
windowsなら、C:\usr\local に置かなきゃ駄目
ってやつ?
51:デフォルトの名無しさん
08/03/05 12:21:31
winバイナリだと正規表現もないのな
52:デフォルトの名無しさん
08/03/05 20:49:16
たしかにwindowsバイナリで、別の場所に入れてました。
c:\usr\local\bin にコピーしてやってみたら使えるようになりました。
どうもありがとう。
Io> 1 to(8) map(v,v**2)
==> list(1, 4, 9, 16, 25, 36, 49, 64)
Io> 1 to(8) map(**2)
==> list(1, 1, 1, 1, 1, 1, 1, 1)
Io> "" asMutable do(65 to(65+25) map(v,append(v)))
==> ABCDEFGHIJKLMNOPQRSTUVWXYZ
53:デフォルトの名無しさん
08/03/22 23:10:19
数値と数値を連結すると文字列じゃなくて数値になるんですね。
Io> 123 .. 456
==> 123456
Io> 123 .. 456 +1
==> 123457
Io> 123 .. 456 /3
==> 123152
Io> 123+456/3
==> 275
54:デフォルトの名無しさん
08/03/23 16:34:50
>>53
type で見てみると Sequence だし
123 .. (456 / 3)
こういうことじゃない?
下のようにするとエラーも出るし。
Io> Number ++ := method(v, self .. v)
==> method(v,
self .. v
)
Io> 123 ++ 456 / 3
Exception: Io Assertion 'operation not valid on non-number encodings'
---------
message '/' in 'Command Line' on line 1
55:デフォルトの名無しさん
08/03/23 16:59:00
対話モードの結果にダブルクオートが出ないから勘違いしたのかな
何でもかんでもオブジェクトをasStringしてつなぐ模様
56:デフォルトの名無しさん
08/03/23 17:50:07
どうも失礼しました。計算したものが連結されてるだけなんですね。
57:デフォルトの名無しさん
08/04/18 01:11:19
Ioで日本語プログラミング
Io でもおk - はてな使ったら負けだと思っている
URLリンク(d.hatena.ne.jp)
関連ページ
第20回 日本語でおk | WIRED VISION
URLリンク(wiredvision.jp)
Ruby もいいけど Smalltalk でも、おk。 - sumim’s smalltalking-tos
URLリンク(d.hatena.ne.jp)
inforno :: 日本語プログラミング言語Scala
URLリンク(inforno.net)
58:デフォルトの名無しさん
08/04/22 18:47:28
DarwinportsでIoを入れたのですが >>49と同じ状態で詰まっています
どのようにすればいいのでしょうか?
59:デフォルトの名無しさん
08/04/22 23:02:02
>>58
普通に落としてインストールする
60:デフォルトの名無しさん
08/04/27 09:17:59
Io> exit
Exception: while saving history file '$HOME/.io_history', reason: Device not configured
---------
saveHistory Z_CLI..io 42
ReadLine ? Z_CLI..io 42
Call relayStopStatus A2_Object.io 295
CLI saveHistory Z_CLI..io 55
Object exit Command Line 1
こんなのが出て正常に終了できない
61:デフォルトの名無しさん
08/04/27 10:35:17
HOME環境変数は設定されてる?
62:デフォルトの名無しさん
08/04/27 12:35:51
できてます
また起動時に.io_historyがあるとすぐ落ちます
63:デフォルトの名無しさん
08/04/29 22:28:52
インクリメント演算子実装してるが
++numなら簡単だが
num++はむずいな
64:デフォルトの名無しさん
08/04/30 17:25:44
なぜ?
65:デフォルトの名無しさん
08/04/30 20:02:09
前置だとmessage call argAt(0)でnumそのものを取得出来て
そっからメッセージの書き換えでnum = num + 1;っていうメッセージを作れるけど
後置だとすでにnumが評価されていてnumのメッセージそのものを取得できない。
66:65
08/04/30 20:27:07
まあ俺がioに詳しくないだけかもしれんけど
67:デフォルトの名無しさん
08/05/01 19:43:40
> ++num
ああ、その手があったか!
68:デフォルトの名無しさん
08/05/21 03:29:46
Ioではオブジェクトリテラル({a:1,b:2}みたいなやつ)って書けないの?
着想を得たってあがってるNewtonScript、Luaにはあったのに。
69:デフォルトの名無しさん
08/05/26 01:27:36
>>68
演算子や中括弧にもメソッド割り当てられるから簡単にできるよ
70:デフォルトの名無しさん
08/05/26 02:59:45
>>69
中括弧に割り当てるのやめて、まじやめて
昔","演算子で泣かされたの重いだして涙目
71:デフォルトの名無しさん
08/05/26 07:59:19
ホワイトスペースに割り当てられたら最強なのにね
72:デフォルトの名無しさん
08/05/26 08:26:26
>>70
いや引数の数チェックしてやればいいだけの話だし
73:デフォルトの名無しさん
08/05/28 03:38:05
>>69
すげえ、本当に簡単に出来るね。
List,Mapでの[]といい、なんで標準で定義してないんだろう。
{} := method(
obj := Object clone
call message arguments foreach(i,obj doMessage(i setName("setSlot")))
obj
)
{a=1,b=1+1} println
74:デフォルトの名無しさん
08/05/31 04:53:46
多分、>>68-73 みたいなFAQな流れを期待して、
Io sugeeeeとなるというのを想定しているのだろう
75:デフォルトの名無しさん
08/07/05 05:35:52
ほしゅ
76:デフォルトの名無しさん
08/07/30 20:44:36
対話型で初期化処理とかできないの?
77:デフォルトの名無しさん
08/08/04 20:26:33
何をしたいの?
78:デフォルトの名無しさん
08/08/05 08:09:26
対話型インタプリタとエディタを同時に使いたい
イメージ的には、
prolog系でのedit.
haskellの処理系の:editみたいなことがしたい
79:デフォルトの名無しさん
08/10/09 13:58:00
hosyu