Io Language

■ このスレッドは過去ログ倉庫に格納されています
2008/01/24(木) 00:03:44
http://www.iolanguage.com/
http://f21.aaa.livedoor.jp/~kizz/prog/io/_docs/IoProgrammingGuide_ja.html
2008/01/24(木) 07:51:21
なんでそんな伸びそうも無いものを。
>1 にネタ振りが出来ないようなら早晩落ちるぞ。
2008/01/24(木) 12:04:58
言語そのものは知らんが実装はガベコレだけ読んだな。
2008/01/24(木) 13:20:05
ioの構文、メッセージ機構はすごく興味あるんだけど
バインディング機構がヘボいから萌えない…
2008/01/24(木) 22:28:07
特殊形式に見えるものが普通のメソッドだったりするからメタプログラミングとかは結構できそうだな
文法もわりとわかりやすいな
2008/01/25(金) 03:22:30
このインターネッツ時代にわざわざ検索しにくい名前をつけんなと
2008/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
2008/01/27(日) 23:15:50
(過去の)関連スレ
{_proto: プロトタイプベース・オブジェクト指向};
http://pc11.2ch.net/test/read.cgi/tech/1109948927/
2008/02/03(日) 10:14:47
>>6
io-language
iolanguage
で検索するよろし
2008/02/03(日) 10:18:52
>>7
Rubyのブロックと同じ問題ですなあ
2008/02/03(日) 10:42:51
v := "before"
が無くても同じ、これは嫌だな
Rubyのは1.9で直ってるんだよね
12デフォルトの名無しさん
垢版 |
2008/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を取り出したいのですが・・・
2008/02/03(日) 10:57:55
> io-languageの話題はここでいいのかな・・・
>
> まあいいや

コピペ失敗 orz ここは読み飛ばしてください
2008/02/03(日) 11:01:52
unko getSlot("puripuri")
ってこと?
2008/02/03(日) 11:45:22
>>14
それだ!!!!1
ありがとうございました。

文字列で渡すのがなんか新鮮に感じた
2008/02/03(日) 19:40:17
何かよさげな言語の予感
2008/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を使ってとりあえず回避。
187
垢版 |
2008/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 メソッドの設定は省ける。
2008/02/05(火) 02:38:43
↓のみてて思ったんだけど、++とか--みたいな演算子って直接呼べないの?
ttp://blog.xole.net/article.php?id=658

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
2008/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
217
垢版 |
2008/02/05(火) 03:24:01
>>19
> value ++ println
これは、value ++(println) となって println は引数として扱われる。
んで、メソッドの側で仮引数を指定していないのでなにも起こらない。
コンソールで 1 が返ってくるのは、コンソールがメソッドの返値を表示するようになっているだけで、
println が表示しているわけではない。
> value ++ := method(v, self = self + 1)
とすれば何が起こっているかわかりやすいかも。

>>20
self はローカル領域オブジェクトのスロットなんじゃない?
変わる方がおかしいと思います。
2220
垢版 |
2008/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なスロットだからか・・・
2320
垢版 |
2008/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`)
http://www.iolanguage.com/scm/git/checkout/Io/docs/IoReference.html
247
垢版 |
2008/02/05(火) 04:42:21
>>23
リファレンス読むと、
  call message previous name
で、出来そうだけど実際には previous が無い模様。
ソース読むと、それっぽい実装はあありました。
使えるようになれば、value ++ とか出来そうですね。
ただ、>>21の問題もあるので細工がいりそうですけど。

>検索しずらいです('A`)
以前のJavaScript使った妙なやつよりはマシな気がする。
2520
垢版 |
2008/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
2620
垢版 |
2008/02/05(火) 05:26:36
ああ、言い忘れた。一応、IoNumber_readFromStream にもあったから、Stream使ったらいけるかも
2720
垢版 |
2008/02/05(火) 06:14:24
連投スマソ。

>>26 のStream関連はまだ使われてないようでした orz

>>24
確かに call message previous で行ける!と思いましたが、
IoMessage_previous の中の実装が ifdef で外されている上に、
Ioのメソッドとして組み込まれてないですね。
2008/02/05(火) 13:10:12
チラシの裏です。

Windows版でコンパイルしたくなって四苦八苦してたんですが、
downloadページで配布されている Io-2008-01-20.tar.gz が、
ShellExecuteのための shell32.lib がリンクされてねえとか、setenvがねえとか、
OS依存なエラーでwin32環境でコンパイルできなくて、どうなっとるねん!!1

エラーつぶしているうちに、Changelog 見たらWindows関連部分が Fix されてるっぽくて、
http://www.iolanguage.com/scm/git/checkout/Io/
↑見たら直ってて、俺の時間返せー!!! って感じです・・・ orz

とりあえず、git落として最新版ダウンロードしたお
2008/02/05(火) 18:18:29
最近のバージョンって do( とかで改行すると、エラーで続きが入力できない。
3019
垢版 |
2008/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
2008/02/06(水) 01:48:38
>>30
解決になっとらんでワロタ
327
垢版 |
2008/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
337
垢版 |
2008/02/06(水) 03:19:22
>>32 書いてて気づいたんだけれど
1 + ; 2
は、 1 + 2 と解釈されるのね。
改行も同様につながってしまう。
そのせいで右辺のメッセージのごまかしが完全じゃない。
2008/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
2008/02/08(金) 14:08:19
++の話題、Smalltalkスレで聞いたら、同じような力技でしたw

アラン・ケイも認めた!Ruby>>>>>Smalltalk
http://pc11.2ch.net/test/read.cgi/tech/1150106090/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)) "
2008/02/08(金) 14:19:36
>>35
Io もレシーバが代入されているスロット名を知る手段があればできるんだけどね。
2008/02/09(土) 07:44:21
つーか何が特徴なの?って物ばっかりだなこの手のは
++にしてもただの欠陥だし
無理矢理処理系の裏技使って解決しました!
ってまるっきりバカに見える
2008/02/09(土) 08:08:10
> つーか何が特徴なの?って物ばっかりだなこの手のは

それは、あなたがバカなだけ

> ++にしてもただの欠陥だし

それは正しい

> 無理矢理処理系の裏技使って解決しました!
> ってまるっきりバカに見える

スマートではないのには同意。
しかし、どの言語にもスマートにできないものはある。
>>37の使っている言語にも苦手な処理はあるだろう?
2008/02/09(土) 08:23:45
>>37 はスマートにディップスイッチでバイナリを直打ちしている
2008/02/09(土) 08:24:26
なんだこいつ
2008/02/09(土) 08:32:58
>>38
これはこれは
別に>>38を名指しでバカって言ったわけじゃないよ
リトマス試験紙にするつもりは無かったのだが

それと、欠陥なら直せば?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況