教育用プログラミング言語ワークショップ2007 -ワープロ07-

http://sigps.tt.tuat.ac.jp/index.php?%B6%B5%B0%E9%CD%D1%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B8%C0%B8%EC%A5%EF%A1%BC%A5%AF%A5%B7%A5%E7%A5%C3%A5%D72007%20%A1%DD%A5%EF%A1%BC%A5%D7%A5%ED07%A1%DD

昨日は一橋大学の佐野書院で行われた表記の会合に出席しました。以下はその簡単なメモ。あくまで伊藤の聞き取った範囲の話なので内容の正確さもその程度のものとご理解ください。

pepsi学習中

いつも参考にさせていただいているhttps://sumim.hatenablog.com/さんにリンクされてしまいました。光栄だ~

id:sumim:20070306:p1

Cokeは凄い人たちに任せてもっぱらpepsiで遊んでいるのですが、せっかくなのでたらい回し関数のpepsi版を晒します。

{ import: st80 }
Time : Object()
Time millisecondClockValue
{
struct timeval tv;
gettimeofday(&tv, 0);
return (oop)(((tv.tv_sec * 1000 + tv.tv_usec / 1000) &0x3fffffff) << 1 | 1);
}
Time millisecondsToRun: block
[
| initialMilliseconds |
initialMilliseconds := self millisecondClockValue.
block value.
^ self millisecondClockValue - initialMilliseconds
]
StaticBlockClosure timeToRun
[
^ Time millisecondsToRun: self
]
TakY : Object ()
TakY x: x y: y z: z
[
x <= y ifTrue: [^ y].
^ self x: (self x: x - 1 y: y z: z)
y: (self x: y - 1 y: z z: x)
z: (self x: z - 1 y: x z: y)
]
[
[TakY x: 12 y: 6 z: 0] timeToRun println.
]

例によって前半はミリ秒での計測をするためのコードです。定義や呼び出しの本体は最後の10行ほどです。(https://sumim.hatenablog.com/さんと同じコードが使えます)

#TimeのmillisecondsToRunの実装はrolloverの処理をはしょってますので危険な用途には使わないでください 🙂

pepsi学習中

このところ本業が忙しくてpepsiと遊ぶ時間がないのですが合間にサンプルを作りました。年度末に学生さんに出したプログラミング課題の一つ、「1000までの整数からユニークに100個を選ぶ」です。

別に凝ってもいないし人に見せるようなものでもないのですが…

{ import: st80 }
"----------------------------------------------------------------"
Random : Object ( seed a m q r )
Random new
[
^super new init
]
Random init
[
[seed := (Time millisecondClockValue bitAnd: 16r3FFFFFFF) bitXor: self hash.
seed = 0] whileTrue.
a := 16807 asFloat.
m := 1073741823 asFloat * 2.0.
q := (m quo: a) asFloat.
r := (m ?? a) asFloat.
]
Random next
[
^(seed := self nextValue) / m.
]
Random nextValue
[
| lo hi aLoRHi |
hi := (seed quo: q) asFloat.
lo := seed - (hi * q).  " = seed rem: q"
aLoRHi := (a * lo) - (r * hi).
^(aLoRHi > 0.0) ifTrue: [aLoRHi] ifFalse: [aLoRHi + m].
]
Random nextInt: anInteger
[
^(self next * anInteger) truncated
]
Time : Magnitude ( _seconds _nanoseconds )
Time seconds		[ ^SmallInteger value_: _seconds ]
Time nanoseconds	[ ^SmallInteger value_: _nanoseconds ]
Time millisecondClockValue
{
struct timeval tv;
gettimeofday(&tv, 0);
return (oop)(((tv.tv_sec * 1000 + tv.tv_usec / 1000) &0x3fffffff) << 1 | 1);
}
"----------------------------------------------------------------"
[
| r c v start msec |
start := Time millisecondClockValue.
r := Random new.
c := Set new.
[ v := r nextInt: 1000.
c add: v.
c size < 100] whileTrue.
msec := Time millisecondClockValue - start.
c println.
msec println.
]

乱数生成がst80になく、joltから引っ張ってきたのでえらく長いですが、本体は一番最後のブロックです(いたって素直なコード?)。種の生成にミリ秒を使っているんでついでに実行時間も測ってみました。(startとmsecのところです)

実行するとこんな感じです。

Set(512 259 775 263 778 523 268 13 526 787 533 21 281 282 795 540 26 28 799 546 804 550 808 302 305 821 822 55 317 61 320 68 587 591 593 851 852 596 341 87 597 601 343 348 97 101 616 106 877 366 115 630 119 632 889 378 127 134 137 907 909 912 656 914 144 662 153 665 921 163 167 939 431 944 177 688 436 182 697 698 191 706 965 710 967 455 977 724 988 991 738 484 999 493 496 499 759 506 253 765)
9

9msですか。結構かかってます。最後のブロックをsqueakのworkspaceに貼付けて実行すると2msです。まあ、この程度のコードで実行時間を測っても意味ないですけどね。

Mac OSX版Squeak不具合

http://d.hatena.ne.jp/nqthm/20070212/p1

でMac OS Xの新しいVMでも日本語が扱えるように書きましたが、やっぱり微妙におかしいことがわかりました。

先の修正を行うとファイル名やディレクトリ名が読めるようになるのですが、濁点や半濁点の文字はおかしなままです。たとえば「プログラム」は「フ?ロク?ラム」となってしまいます。

うーむ。

pepsi勉強中

サンプルを作ってみようとhttps://sumim.hatenablog.com/さんの自然対数の底を求めるプログラムを移植してみました。

Intervalがないのでいろいろ追加したせいで結構長くなってしまいました。

{ import: st80 }
Interval : Collection (start stop step)
Interval new
[
self := super new.
start := 0.
stop := 0.
step := 1.
]
Interval start: aNumber [ start := aNumber ]
Interval stop: aNumber  [ stop := aNumber ]
Interval step: aNumber  [ step := aNumber ]
Interval do: aBlock
[
| aValue |
aValue := start.
step < 0
ifTrue: [  [stop <= aValue]
whileTrue:
[aBlock value: aValue.
aValue := aValue + step]  ]
ifFalse: [  [stop >= aValue]
whileTrue:
[aBlock value: aValue.
aValue := aValue + step]  ]
]
Integer to: aNumber
[
| obj |
obj := Interval new.
obj start: self.
obj stop: aNumber.
^ obj
]
Integer factorial
[
self = 0 ifTrue: [^ 1].
self > 0 ifTrue: [^ self * (self - 1) factorial].
self error: 'Not valid for negative integers'
]
[
((1 to: 12) inject: 1 into: [:e :i | e + (1 / i factorial)])  println
]

LargePositiveInteger does not understand ‘asFloat’

ということで割り算が途中でできなくなるため100でなく12で終わりです。自分で実装すればいいんですが面倒なので。

IntervalやfactorialはSqueakのもののほぼコピペです。結構あっさり動いてしまうので拍子抜けしました。

pepsiはプロトタイプベース言語?

こっちに引っ越してきました。

pepsi.htmlを読んでいます。表題の通りなんですね。Smalltalk/80と似た言語ということで頭っからクラスベースと思い込んでいました。

むちゃくちゃな例ですが、こんなことができます。

{ import: st80 }
Wao : Object ()
Wao wao [ 'wao' println ]
[
Wao wao.
]
Wap := [ Wao new ]
Wao wap [ 'wap' println ]
[
Wap wao.
]

WaoはObjectを継承するプロトタイプオブジェクトです。Objectを継承する理由は、途中でnewメソッドを使っているからです。これはただの宣言のように見えますが実際Waoオブジェクトを作成したことになります。

その次の行でWaoにメソッドwaoを追加しています。これは画面にwaoと表示します。

トップレベルにある大カッコで囲まれたのはブロックで、ファイルの頭の方のものから実行されます。最初のものは定義したWaoにいきなりwaoメッセージを送ります。

WapはTranslation Unit変数(変換単位変数?グローバル変数のようなもの)で、プロトタイプWaoのコピーが格納されます。

次のはWaoオブジェクトにwapメソッドを追加しています。

最後のブロックはWapにwaoを送ったり、後から追加したwapをWaoに送ったりしています。

出力は以下のようになります。

'wao'
'wao'
'wap'
'wap'

st80ライブラリやjoltのソースを見るとかなりいろんなことがわかります。

pepsi学習開始

来年の専門ゼミで扱うLLを探しているうちに、(インタープリタじゃない時点でLLじゃないんでしょうが)pepsiが面白そうに思えたので学び始めることにしました。

これを読みながら勉強です。

http://www.piumarta.com/pepsi/pepsi.html

インストールはこちらを参考にしました。

https://propella.hatenablog.com/entry/20070112/p3

最初はお決まりのプログラム(hello.st)を作ってみました。

{ import: st80 }
[
'hello world.?n' put
]

上記をコンパイルするには、以下のようにします。

idc hello.st

結果としてhelloというバイナリができるので、./helloで実行できます。

./hello
hello world.

適当に先のpepsi.htmlを訳しながら学び進めていこうと思っています。

Squeak 3.8.14beta7U(mac)での日本語表示

squeak.orgで公開されているmac版ですが、ただそのままインストールしても日本語がうまく表示されません。問題はファイルリストなどで日本語のファイル名を表示させたときで、日本語の部分が?になってしまいます。

とりあえずsqueak3.0.appでごまかしていたのですが、ちゃんと表示させる方法がありました。

http://squeak.sakura.ne.jp/modules/newbb/viewtopic.php?topic_id=41&forum=8

上記のSqueaker’s Scrapbookにある、ゲストさんの発言で

さっそく確認ありがとうございます。

動作確認に際して、私の方で書き漏らしがあったので補足したいのですが

1)VMアイコンを「パッケージの内容を表示」で開く

2)Contentsフォルダの中のInfo.plistをダブルクリックしてPropertyList Editorで開く

3)Rootからのツリーを展開しSqueakEncodingTypeの値をmacintoshからUTF-8に変更して保存する。パッケージのウィンドウを閉じる

という前処理が必要でありました。

もしすでにやられてた上での確認でしたらご容赦。

これをやったらちゃんと日本語ファイルなんかが表示できるようになりました。

#もちろん、梅澤さんのJapanese Environmentをインストールした後で。

さきのページでは日本語入力がおかしいとの内容ですが、今のバージョンでは特に問題なく入力できました。

#インライン入力ではないですが。

とりあえず備忘録として。

野良仕事

今日は久しぶりに農業ボランティアの仕事をしてきました。枯れた雑草の始末のついでに今年の活動についての打ち合わせを行いました。昨年はかなりの作物が雑草にやられてしまったので、今年は雑草を抑える工夫をしようということになりました。手を入れにくい場所には花を植えることと、昨年かなり調子のよかったジャガイモ、サツマイモを広げようと考えています。キャベツもかなりよかったので今年もやるでしょう。

イモ類に関しては、区画を作って希望者を募り、自由に管理してもらおうかと考えています。そうすることでイモのメンテを任せることができて我々は別の作業をすることができます。何より週末に人がくるようになれば山に活気がでるでしょう。

ジャガイモは強いですね。今日掘り返してみたらまだまだ掘り残したイモがたくさん残っていました。ダメなものもありましたが食べられるものが3kgは出たと思います。

身体がなまっているので半日の仕事でヘトヘトです。来週末もがんばろう。