僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。
SqueezのGNU Smalltalk-3.1.6。
チュートリアルと睨めっこして、あーでもこーでもなし。
st> x := Array new: 5 (nil nil nil nil nil ) st> x at: 3 put: 4 4 st> x (nil nil 4 nil nil ) st> x at: 6 Object: Array new: 5 "<0x558893b8>" error: Invalid index 6: index out of range SystemExceptions.IndexOutOfRange(Exception)>>signal (AnsiExcept.st:216) SystemExceptions.IndexOutOfRange class>>signalOn:withIndex: (AnsiExcept.st:839) Array(Object)>>checkIndexableBounds: (Object.st:772) Array(Object)>>at: (Object.st:832) UndefinedObject>>executeStatements (a String:1) nil
IT Pro と
IPAの記事。
RLOは、
Unicode Consortium のページの
PDFに載っていた。
久々のpython3 (with debian squeeze)で追試してみた。
$ cat rlomark_test.py #!/usr/bin/env python3 h_a = chr(0x3042) rlo = chr(0x202e) h_i = chr(0x3044) h_u = chr(0x3046) h_e = chr(0x3048) h_o = chr(0x304A) print ("No RLO: ", h_a, h_i, h_u, h_e, h_o) print ("First is RLO: ", rlo, h_a, h_i, h_u, h_e, h_o) print ("Second is RLO: ", h_a, rlo, h_i,h_u, h_e, h_o) print ("Third is RLO: ", h_a, h_i, rlo, h_u, h_e, h_o )
の、実行結果。
$ python3 rlomark_test.py No RLO: あ い う え お First is RLO: お え う い あ Second is RLO: あ お え う い Third is RLO: あ い お え う
Snow Leopard のコマンドライン上では見えなかったが、Vim にコピペすると、次のように見えた。
$ python3 rlomark_test.py No RLO: あ い う え お First is RLO: <202e> あ い う え お Second is RLO: あ <202e> い う え お Third is RLO: あ い <202e> う え お
で、それにもとづいて、次のような処理をやってみた。
cpname = 'foo' + rlo + 'fdp.exe' os.rename(orig, cpname)
notepad.exe で試す。
このファイルは、端末によっては.pdf に見えたり、見えなかったりする。
騙そうと思えば、騙せるかもしれない
程度にはなった。
アイコンを入れ替えれば、もう少しまともに見えるかもしれない。
そのままでは"_"が入力できないと気づく。
何回Twitterに書いても頭に入らないので改めてメモ。
ドメインを定義したXMLを修正。
Squeeze なら /etc/libvirt/qemu の下とか。
<graphics type='vnc' port='-1' autoport='yes' keymap='ja' />
それから sudo /etc/init.d/libvirt-bin restart を忘れないように。
チュートリアルを(よ)みながらのgst 続く。
配列はこないだやってみたっけ。
st> x nil st> x := Array new: 3 (nil nil nil ) st> x (nil nil nil ) st> y := x (nil nil nil ) st> x at: 1 put: 2; at: 3 put: 'foo' 'foo' st> x (2 nil 'foo' ) st> y (2 nil 'foo' ) st> (x at: 1) * (x at: 1) 4 st> x ! (2 nil 'foo' ) st> x nil st> y nil
配列の要素数変更はどうするのか、まだわからない。
<後記>
";" は、一つのオブジェクトに連続してメッセージを送ることを意味する記法で、「カスケード」と称するらしい。
</後記>
st> x := Set new Set () st> x add: 'foo'; add: 3 3 st> x Set (3 'foo' ) st> x remove: 3 3 st> x Set ('foo' ) st> x includes: 'foo' true st> x includes: 5 false
混ぜられる記法もあるらしい。
st> set := Set new Set () st> array := Array new: 5 (nil nil nil nil nil ) st> set add: 'foo' . array at:2 put: 5 'foo' 5 st> set . array Set ('foo' ) (nil 5 nil nil nil )
載っていた "yourself" いまいち意味がピンとこないような。
幾分なげやりになってきた。
st> dict := Dictionary new Dictionary ( ) st> dict at: 'One' put: 3 3 st> dict at: 'One' 3 st> dict at: 'ひとつめ' put: '一つ目' '一つ目' st> dict Dictionary ( 'One'->3 'ひとつめ'->'一つ目' )
Squeak の
チュートリアルを眺めながらあれこれ。
Gnu Smalltalk にも色々喰わせてみている。
メッセージの区切りは、"." らしい。一行だけなら付けなくても
動くが、一応付けるようにしよう。
st> #(1 2 5 3) last. 3 st> y := #(4 3 'foo'). (4 3 'foo' ) st> y last. 'foo'
#( object1 object2 ...)が配列ということか。
st> x := Array new: 3. (nil nil nil ) st> y nil st> y := Array new: 3. (nil nil nil ) st> x = y true st> z := #(nil nil nil). (nil nil nil ) st> x = z. true st> x at: 2 put: 4. 4 stst> z at: 2 put: 4. Object: Array new: 3 "<0x403658e0>" error: Invalid value nil: object is read-only (ry nil
うーん、いま一つわからん。
st> #('あ' 'い' 'う' 3 'foo' "bar") size. 5 st> #('あ' 'い' 'う' 3 'foo' "bar") last. 'foo'
"foo" はコメントになるようだ。
st> $a asciiValue. 97 st> $b asciiValue. 98 st> $が asciiValue. stdin:190: Invalid character literal, only character codes \ from 0 to 127 are valid stdin:190: Invalid character 0xac
Squeak では ASCII以外も通るようだった。
Transcript と Workspace を開き、Workspaceに打鍵した
Transcript show: $あ asciiValue.
を評価させると、20983074 がTranscript に表示された。
Transcript clear. で消える。
st> | foo bar baz lastobj | st> foo := #'abc'. #abc st> bar := foo last. $c st> baz := bar asciiValue. 99 st> lastobj := baz + 10. 109 st> ^lastobj. 109
GStの対話環境でもコピペ一発で動いた。
スクリプトにもできた。最終行は lastobj printNl. とする。
st> 3 + 7 * 5 50 st> 3 + (7 * 5) 38
端末によって違っていた。
例えば ja_JP.eucJP。
st> 'いろはにほへと' copyFrom: 3 to: 8 'ろはに' st> 'いろはにほへと' copyReplaceFrom: 3 to: 6 with: 'ロハニ'. 'いロハニにほへと'
次に ja_JP.UTF-8。
st> 'いろはにほへと' copyFrom: 4 to: 12 'ろはに' st> 'いろはにほへと' copyReplaceFrom: 4 to: 12 with: 'ロハニ'. 'いロハニほへと'
これ以外では化けたり化けなかったりする。
ちなみに Squeak の Workspace では、 copyFrom: 2 to: 4. とかでOKだった。
もう少しSmalltalk。
単項メッセージ
>
二項メッセージ
>
キーワードメッセージ
。
Squeakにて。
'なかぬならころしてしまへほととぎす' copyFrom: 6 to: 10 negated + 22. ↓ 'なかぬならころしてしまへほととぎす' copyFrom: 6 to: 10 negated + 22. ↓ 'なかぬならころしてしまへほととぎす' copyFrom: 6 to: -10 + 22. ↓ 'なかぬならころしてしまへほととぎす' copyFrom: 6 to: 12. ↓ ころしてしまへ
st> 10 + 3 13 st> 10 - 3 7 st> 10 * 3 30
ここは普通のようだ。
st> 10 / 3 10/3 st> 10.0 / 3 3.3333333333333335 st> 10 / 3.0 3.3333333333333335
% は剰余ではないみたい。
st> foo := 5 5 st> bar := 0 0 st> [foo >= bar] whileTrue: [ bar printNl . bar := bar + 1 ] 0 1 2 3 4 5 nil
徐々に某スクリプト言語に踏襲されたっぽいものが。
st> 1 to: 5 do: [:x | Transcript show: 'これは ', st> x printString , '番目です。' ; cr.] st> . これは 1番目です。 これは 2番目です。 これは 3番目です。 これは 4番目です。 これは 5番目です。 1
"cr" を省略すると、出力に改行が入らなくなった。
スクリプトをファイルにすると、最後の"1"は出なかった。
"printNl"すると、
1 これは 番目です。 2 これは 番目です。 3 これは 番目です。 4 これは 番目です。 5 これは 番目です。 1
となった。
リファレンスないかなぁ。
それから、to: by: do: も。
st> 5 to: 1 by: -2 do: [:x | Transcript show: 'これは ', st> x printString , '番目です。' ; cr.]. これは 5番目です。 これは 3番目です。 これは 1番目です。 5
ググったり打鍵したり。で、なんとか。
Gnu Smalltalk の 3.2.4 では、変数やクラスなどには
マルチバイト文字が使えないっぽい。
st> s1 := Set new. Set () st> s2 := Set new. Set () st> s1 add: 'いぬ' ; add: 'さる'; add: 'きじ'. 'きじ' st> s2 add: 'さる' ; add: 'ぶた'; add: 'かっぱ'. 'かっぱ' st> s1. Set ('きじ' 'いぬ' 'さる' ) st> s2. Set ('かっぱ' 'ぶた' 'さる' ) st> s1 inspect. An instance of Set tally: 3 contents: [ 'きじ' 'いぬ' 'さる' ] Set ('きじ' 'いぬ' 'さる' )
and はすぐわかった。
or, xor は "|" などを入れてもダメだったが、別段演算子が
必要なわけでもない。はずだ。
st> s1 & s2. Set ('さる' ) st> s1 - ((s1 - s2) + (s2 - s1)). Set ('さる' ) st> s1 + s2. Set ('かっぱ' 'きじ' 'いぬ' 'ぶた' 'さる' ) st> (s1 - s2) + (s2 - s1). Set ('かっぱ' 'きじ' 'いぬ' 'ぶた' )
25年前に出たSmalltalkの本(ISBN4-7828-5025-5 C3355) にあった例題を少し変えて試してみた。
st> a := 2. 2 st> power := [a := a * a]. a BlockClosure st> power value. 4 st> power value. 16 st> a. 16 st> a := 3 3 st> 6 timesRepeat: [ power value printNl ]. 9 81 6561 43046721 1853020188851841 3433683820292512484657849089281 6
調子に乗って大きな数を指定していると、
"Global garbage collection... done, heap grown" "Global garbage collection... done" "Global garbage collection... done, heap grown" "Global garbage collection... done, heap grown" "Global garbage collection... done, heap grown" "Global garbage collection... done, heap grown" "Global garbage collection... done, heap grown"
基数 + r + 数値。デフォルトで10進を返す。
st> 16rFF. 255 st> 16rff. stdin:2: Unexpected EOF while scanning number
squeakではエラーにならなかった。
冪乗計算例。
st> -4 to: 4 do: [:x | (2 raisedTo: x) printNl ]. 1/16 1/8 1/4 1/2 1 2 4 8 16 -4
ここまでは、別段ということもなかった。
st> 2 raisedTo: 10 1024 st> 2 raisedTo: 20 1048576 st> 2 raisedTo: 30 1073741824 st> 2 raisedTo: 40 1099511627776
Gnu Smalltalk は、シェルの伝統通りに(?)Tab、Squeak はctrl/Command + q だった。
前に二回も書いた(
過去1、
過去2)
倍増し算。
初期値の処理がうまくできなかったが(汗、まぁいいか。
st> aNum := 1 1 st> tNum := 1 1 st> allNum := [ aNum := aNum * 2] a BlockClosure st> totalNum := [ tNum := tNum + (allNum value)]. "丸括弧は省略できない" a BlockClosure st> 63 timesRepeat: [ totalNum value printNl]. 3 7 15 31 (ry 2305843009213693951 4611686018427387903 9223372036854775807 18446744073709551615
ここに書き付ける間に追試すると、どこかがおかしくなって
まともな結果が出なかった。
スクリプトをファイルに落として、確認。
上左より、「カテゴリ」「クラス」「メッセージ・カテゴリ」「メソッド」
の順番で表示している、らしい。
残念ながら、これは覚えるしかなさげ。
例えば、"Kernel-Numbers" カテゴリの "Integer" クラスの "arithmetic" メッセージカテゴリに
"+" メソッドが存在している。
下段は説明らしいが、なんのことやらさっぱり。
結構実装依存だったりする。
st> 1234.5678s9 1234.567800000s9
固定小数点の例。
これはSqueakも同様。
st> 98765432.1 + 0.1 98765432.19999999
Squeak では、
98765432.1 + 0.1 => 9.87654322e7
今見ている
Smalltalkの本(VisualWorks 2.5Jを前提)には、
単精度や倍精度を表す"d", "q" などの添字があるが、
少なくともSqueakではエラーになった。
gst は飲み込んでいるようだけど、スルーしていないのかどうか
はまだよくわからない。
リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。