1read 100read
2013年06月プログラム213: Io Language (130) TOP カテ一覧 スレ一覧 2ch元 削除依頼
Matplotlib でグラフプログラミング【Python】 (171)
ゲームプログラムなら俺に聞け28 (246)
【初心者歓迎】C/C++室 Ver.84【環境依存OK】 (929)
VBで作られた有名なアプリって何? (165)
float 使うヤツはドシロートかおぢさん (148)
ネットワークプログラミング雑談 (189)

Io Language


1 :2008/01/24 〜 最終レス :2013/03/23
http://www.iolanguage.com/
http://f21.aaa.livedoor.jp/~kizz/prog/io/_docs/IoProgrammingGuide_ja.html

2 :
なんでそんな伸びそうも無いものを。
>1 にネタ振りが出来ないようなら早晩落ちるぞ。

3 :
言語そのものは知らんが実装はガベコレだけ読んだな。

4 :
ioの構文、メッセージ機構はすごく興味あるんだけど
バインディング機構がヘボいから萌えない…

5 :
特殊形式に見えるものが普通のメソッドだったりするからメタプログラミングとかは結構できそうだな
文法もわりとわかりやすいな

6 :
このインターネッツ時代にわざわざ検索しにくい名前をつけんなと

7 :
>>5
それは良いけど、これはいただけない気が…
Range
v := "before"
f := method(arg, arg)
v println  #=> before
0 to(10) foreach(v, v println) #=> 012345678910
v println #=> 10

8 :
(過去の)関連スレ
{_proto: プロトタイプベース・オブジェクト指向};
http://pc11.2ch.net/test/read.cgi/tech/1109948927/

9 :
>>6
io-language
iolanguage
で検索するよろし

10 :
>>7
Rubyのブロックと同じ問題ですなあ

11 :
v := "before"
が無くても同じ、これは嫌だな
Rubyのは1.9で直ってるんだよね

12 :
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 :
> io-languageの話題はここでいいのかな・・・
>
> まあいいや
コピペ失敗 orz ここは読み飛ばしてください

14 :
unko getSlot("puripuri")
ってこと?

15 :
>>14
それだ!!!!1
ありがとうございました。
文字列で渡すのがなんか新鮮に感じた

16 :
何かよさげな言語の予感

17 :
>>7
v := "before"
f := method(arg, arg)
v println #=> before
Sandbox doSandboxString("Range; 0 to(10) foreach(v, v println)")
v println
スマートとは言い難いけど、Sandboxを使ってとりあえず回避。

18 :
>>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 :
↓のみてて思ったんだけど、++とか--みたいな演算子って直接呼べないの?
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

20 :
>>19
selfに代入しても、元のが変わらんっぽい
Io> value := 0
==> 0
Io> value test := method(self = "banzai!")
==> method(
self = "banzai!"
)
Io> value test
==> banzai!
Io> value
==> 1

21 :
>>19
> value ++ println
これは、value ++(println) となって println は引数として扱われる。
んで、メソッドの側で仮引数を指定していないのでなにも起こらない。
コンソールで 1 が返ってくるのは、コンソールがメソッドの返値を表示するようになっているだけで、
println が表示しているわけではない。
> value ++ := method(v, self = self + 1)
とすれば何が起こっているかわかりやすいかも。
>>20
self はローカル領域オブジェクトのスロットなんじゃない?
変わる方がおかしいと思います。

22 :
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 :
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

24 :
>>23
リファレンス読むと、
  call message previous name
で、出来そうだけど実際には previous が無い模様。
ソース読むと、それっぽい実装はあありました。
使えるようになれば、value ++ とか出来そうですね。
ただ、>>21の問題もあるので細工がいりそうですけど。
>検索しずらいです('A`)
以前のJavaScript使った妙なやつよりはマシな気がする。

25 :
絶対にスマートにできる方法があるはず!と思ってソース見たら
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 :
ああ、言い忘れた。一応、IoNumber_readFromStream にもあったから、Stream使ったらいけるかも

27 :
連投スマソ。
>>26 のStream関連はまだ使われてないようでした orz
>>24
確かに call message previous で行ける!と思いましたが、
IoMessage_previous の中の実装が ifdef で外されている上に、
Ioのメソッドとして組み込まれてないですね。

28 :
チラシの裏です。
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落として最新版ダウンロードしたお

29 :
最近のバージョンって do( とかで改行すると、エラーで続きが入力できない。

30 :
なるほど、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 :
>>30
解決になっとらんでワロタ

32 :
無理矢理解決してみた。
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 :
>>32 書いてて気づいたんだけれど
1 + ; 2
は、 1 + 2 と解釈されるのね。
改行も同様につながってしまう。
そのせいで右辺のメッセージのごまかしが完全じゃない。

34 :
俺も...と思ったけど、ダメだったorz
value := 0
value ++ := method(
call message setName("call")
call sender setSlot("self", self + 1)
)
(value ++) println //1
value println // 0

35 :
++の話題、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)) "

36 :
>>35
Io もレシーバが代入されているスロット名を知る手段があればできるんだけどね。

37 :
つーか何が特徴なの?って物ばっかりだなこの手のは
++にしてもただの欠陥だし
無理矢理処理系の裏技使って解決しました!
ってまるっきりバカに見える

38 :
> つーか何が特徴なの?って物ばっかりだなこの手のは
それは、あなたがバカなだけ
> ++にしてもただの欠陥だし
それは正しい
> 無理矢理処理系の裏技使って解決しました!
> ってまるっきりバカに見える
スマートではないのには同意。
しかし、どの言語にもスマートにできないものはある。
>>37の使っている言語にも苦手な処理はあるだろう?

39 :
>>37 はスマートにディップスイッチでバイナリを直打ちしている

40 :
なんだこいつ

41 :
>>38
これはこれは
別に>>38を名指しでバカって言ったわけじゃないよ
リトマス試験紙にするつもりは無かったのだが
それと、欠陥なら直せば?

42 :
欠陥ではなくセマンティックスの違いでしょう。
変数を箱のようなものと捉えるか、ラベルのようなものと捉えるか、という。

43 :
マクロを導入すればいいのに。それで解決する問題だ。

44 :
>>43
あーそーゆーことね。

45 :
まー、Ioはマクロがなくてもこれだけできる!みたいなところはある
というかマクロも実装できそうだがどうか

46 :
っていうか、
>>41
>それと、欠陥なら直せば?
あなたの使ってる言語はすぐ直せるの欠陥?
だいたいの場合、欠陥があったら言語のコアな部分を弄らないといけないと思うんだけど、そうじゃないのが現実なんだろうか...?
small talkの例がでたけど、ioとかこの辺の言語は、その欠陥をなんとかできそうな感じなんだよな。
だからみんな魅力を感じてるんじゃないかと。

47 :
++関連見てきた。
http://pc11.2ch.net/test/read.cgi/tech/1188997302/559
なんかすげー理解が広がリングwww
これ見ると言語実装論みたいのが分かって面白いわ
あと、smalltalkの実装も面白い

48 :
IoでObjective-Cの文法を導入する試み。
こういう「クレージー」なことができる言語は素晴らしい。
が、日常的に使いたいかどうかはまた別問題である。
http://www.rubyist.net/~matz/20080216.html#p01

49 :
Rangeってどうすれば使えるのでしょうか?
何か準備がいるのかな。
Io 20070410
Io> Range
Exception: Object does not respond to 'Range'
---------
Object Range Command Line 2

50 :
windowsなら、C:\usr\local に置かなきゃ駄目
ってやつ?

51 :
winバイナリだと正規表現もないのな

52 :
たしかに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 :
数値と数値を連結すると文字列じゃなくて数値になるんですね。
Io> 123 .. 456
==> 123456
Io> 123 .. 456 +1
==> 123457
Io> 123 .. 456 /3
==> 123152
Io> 123+456/3
==> 275

54 :
>>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 :
対話モードの結果にダブルクオートが出ないから勘違いしたのかな
何でもかんでもオブジェクトをasStringしてつなぐ模様

56 :
どうも失礼しました。計算したものが連結されてるだけなんですね。

57 :
Ioで日本語プログラミング
Io でもおk - はてな使ったら負けだと思っている
http://d.hatena.ne.jp/mr_konn/20080304/1204632557
関連ページ
第20回 日本語でおk | WIRED VISION
http://wiredvision.jp/blog/masui/200803/200803030100.html
Ruby もいいけど Smalltalk でも、おk。 - sumim’s smalltalking-tos
http://d.hatena.ne.jp/sumim/20080303/p1
inforno :: 日本語プログラミング言語Scala
http://inforno.net/articles/2008/03/04/japanese-language-programing-in-scala

58 :
DarwinportsでIoを入れたのですが >>49と同じ状態で詰まっています
どのようにすればいいのでしょうか?

59 :
>>58
普通に落としてインストールする

60 :
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 :
HOME環境変数は設定されてる?

62 :
できてます
また起動時に.io_historyがあるとすぐ落ちます

63 :
インクリメント演算子実装してるが
++numなら簡単だが
num++はむずいな

64 :
なぜ?

65 :
前置だとmessage call argAt(0)でnumそのものを取得出来て
そっからメッセージの書き換えでnum = num + 1;っていうメッセージを作れるけど
後置だとすでにnumが評価されていてnumのメッセージそのものを取得できない。

66 :
まあ俺がioに詳しくないだけかもしれんけど

67 :
> ++num
ああ、その手があったか!

68 :
Ioではオブジェクトリテラル({a:1,b:2}みたいなやつ)って書けないの?
着想を得たってあがってるNewtonScript、Luaにはあったのに。

69 :
>>68
演算子や中括弧にもメソッド割り当てられるから簡単にできるよ

70 :
>>69
中括弧に割り当てるのやめて、まじやめて
昔","演算子で泣かされたの重いだして涙目

71 :
ホワイトスペースに割り当てられたら最強なのにね

72 :
>>70
いや引数の数チェックしてやればいいだけの話だし

73 :
>>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 :
多分、>>68-73 みたいなFAQな流れを期待して、
Io sugeeeeとなるというのを想定しているのだろう

75 :
ほしゅ

76 :
対話型で初期化処理とかできないの?

77 :
何をしたいの?

78 :
対話型インタプリタとエディタを同時に使いたい
イメージ的には、
prolog系でのedit.
haskellの処理系の:editみたいなことがしたい

79 :
hosyu

80 :
以下のコードで、最後が false になってしまうのはなぜなんでしょうか?
その前の出力を見る限りでは同じオブジェクトに見えるんですが…
Foo := Object clone
Foo priv := method(
  list(call sender, self)
)
Foo bar := method(
  self priv
)
l := Foo bar
l println
l at(0) println #=> Foo_0x80a87f0 ...
l at(1) println #=> Foo_0x80a87f0 ...
((l at(0)) == (l at(1))) println #=> false !!

81 :
typeを見るとObjectとFooになってるね

82 :
>>81
レスありがとうございます。
l at(0) type println #=> "Object"
l at(1) type println #=> "Foo"
と、すると確かに違っていますね。
両方 Foo になっているべきに思えるんですが…うーん。

83 :
仮想機会のバグだ
一期一会だ

84 :
そうですね。バグですよね…。
レポートしておきます。

85 :
バグではないそうです。
call sender は呼び出し元のセルフではなく、ローカル環境(?)を返すとのこと。
(なので、call sender self とすれば良かった)
それで思いついて試したんですが、呼び出し元の変数を書き換えたりもできるんですね。
Foo := Object clone
Foo bar := method(
  call sender v println
  call sender v = "new value"
)
Object clone do(
  v := "local value"
  Foo bar           #=> local value
  v println         #=> new value
)


86 :
Mac Portsにあったんでインストールしてみたものの「io」て打ちこんでも
コマンド見つからねーとか言うからport contentsしてみたらバイナリ名が「osxvm」だった。

87 :
皆Windowsでioやる時って、公式のWindows版バイナリ使ってます?
それとも自分でビルドしたの使ってます?
最新tarをMingwでビルドしようと思ったら、
IoFile.cでsys/wait.h使ってるらしくビルド通らないんですよね・・・。
回避案・代案知ってる人教えてください。

88 :
ヘッダファイル削除すりゃいいじゃん・・

89 :
ヘッダファイルの削除というのは、私には少々難しそうなので
まずCygwin使って再度挑戦してみたいと思います。
ありがとうございました。

90 :
↓Scalaスレで気になったことがあったんですが、IOだとこの辺の
優先順位の実装ってどんな風になってるんでしょうか?
プログラミング言語 Scala
http://pc11.2ch.net/test/read.cgi/tech/1205156417/739-743
739 デフォルトの名無しさん [] 2009/02/12(木) 02:57:16
+ や * はメソッドだって聞いたけど、
2 + 3 * 4 は 14ってちゃんと評価してくれるんだね
メソッドチェーンになるから、20が戻ってくると思った
これって遅延評価のおかげ?
Scalaのソースをちゃんと読まないといけないんだろうけど
740 デフォルトの名無しさん [sage] 2009/02/12(木) 03:21:54
+や*がメソッドだというのは間違ってないけど、中置式のメソッド呼び出しに
関しては、演算子の最初の1文字で優先順位が決まるというルールになってる。
このルールのおかげで、算術式に関しては直感的な動作をしてくれる。
Scala言語仕様6.12.3 Infix Operationsによると、優先順位は以下のようになってる。
letter < '|' < '^' < '&' < '<', '>' < '=', '!' < ':' < '+', '*' < '/', '%' < all other special characters
たとえば、
"HOGE" charAt 0 + 1
という式があった場合、charAtの最初の文字はletterなので、+よりも演算子としての優先順位は低い。
そのため、
"HOGE".charAt((0).+(1))
と解釈される。

91 :

741 デフォルトの名無しさん [sage] 2009/02/12(木) 03:22:54
訂正。s/letter/all letters/
742 740 [sage] 2009/02/12(木) 03:25:55
ありゃりゃ。コピペして不等号加えるときにミスったorz
正しくは、以下。
all letters < '|' < '^' < '&' < '<', '>' < '=', '!' < ':' < '+', '-' < '*', '/', '%' < all other special characters
743 739 [] 2009/02/13(金) 00:44:52
>>740
サンクス
BigDecimalでも試したけど、ちゃんと掛け算・割り算を優先するってありがたいな
RemoteActorの動作がいまいちわからなかったり(コンパイルした後、scalaコマンドで動かないのに、javaコマンドからだったらちゃんと動くとか)
わからんことだらけなんだけど、しばらく弄ってみることにする

92 :
ttp://f21.aaa.livedoor.jp/~kizz/prog/io/_docs/IoProgrammingGuide_ja_only.html
マニュアルには
標準の演算子の優先順位は C 言語と同じ
ユーザー定義の演算子は常に左から右へ
とある

93 :
なるほど・・・
> ユーザ定義の演算子 (標準の演算子名は使えない) は、常に左から右に動作する。 Us
「ユーザ定義」は「常に左から右」か
Scalaは最初の一文字できまるということなので、Scalaの方がよいかもだな・・・。

94 :
「左から右へ」は演算子が左結合ってことじゃないの? 
定義するときに優先度指定はできるよ 
以下を参考に 
ttp://subtech.g.hatena.ne.jp/cho45/20071021/1192926373

95 :
文字列パースにおいてのみ機能するようだ
あと、
ttp://www.nabble.com/Question-about-OperatorTable-and-difference-between-Interpreter-Scripts-td17356792.html
対話環境とスクリプト環境では挙動が変わるらしい

96 :
MinGWでビルドできました。
>>88さんが仰っていたように、
<sys/wait.h>をコメントアウトして
Line:238辺りにある
 IONUMBER(WEXITSTATUS(exitStatus))

 IONUMBER( ( (exitStatus >> 8) & 0xff) )
と書き直したらいけました。
今更ですが、ありがとうございました。

97 :
ねーよw

98 :
96です。
久しぶりにgithubから最新取ってきてコンパイルしてみましたが、
>>96の問題は修正されていました。良かった。
しかし今度はアドオンが上手く動かせていません。
使っている方いましたら、動作具合を教えて頂けないでしょうか?

99 :
ろびー!

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
Kinect ハック 2台目 (203)
LLにおける関数型プログラミング (103)
【初心者歓迎】C/C++室 Ver.84【環境依存OK】 (929)
【PHP,Python】スクリプト,バトルロワイヤル35【Perl,Ruby】 (414)
つまりRubyってPerlの後続じゃん? (192)
JAVAってこんなことも出来ないの? (670)
--log9.info------------------
南高ソング (165)
バンドの動員を増やすには? (711)
おやじギターやり直しpart4 (118)
【ノルマ】ライブハウス出るのや〜めた【タカスギ】 (792)
毎回ノルマ達成してる? (142)
雑談スレ in バンド板 (190)
中毒性のあるバンドを教えてくれ (113)
やりたくないライヴの苦痛さは異常 (235)
腐った日本をロックで変えたい (125)
機材車スレッド (137)
楽器、作曲ができないボーカルってなんなの? (138)
メンボサイト総合スレ (106)
なんでミュージシャンはドラッグやるの? (155)
奇 跡 の 変態バンド (174)
けいおん!! 放課後ティータイムについて語ろう (106)
【メンボ?】with9にモノ申す【R系?】 (117)
--log55.com------------------
The Tower SP ┃9F┃λλλλλ... ザ・タワー
【独特】ラブルセイバー総合【ムード】
ゲームボーイ流行らせようぜ
【GB】X(エックス)総合スレ【3Dシューティング】
携帯ゲーレトロでのうわぁぁぁぁ
エアーマンが倒せない
STG シューティングゲーム >‥‥
(ポケットステーション)