1 :デフォルトの名無しさん:2005/11/07(月) 16:47:13
全然スレ立たないけどみんな興味無いの?

いっしょに遊びましょ♪

84 :デフォルトの名無しさん:2006/05/04(木) 12:03:01
実際squeakはとっつきにくい。関連したwebや書籍をみても
「オブジェクトありき」とか「すべてはメッセージ」とか、開発者寄りの話
しか見つからない。
初めて(生)MS-DOSを触ったときを思い出した。途方にくれるカンジ。

91 :デフォルトの名無しさん:2006/05/05(金) 04:59:12
最新Squeak(英語版)をGetして実行したら、Package Browserを発見。
ここに列挙されたclassが全部実装されているかと思うと喚起雀躍。
さっそくSqueakからtelnetしたいと思った。
Package BrowserからTelnetMachineというclass発見。そこで、
host := TelnetMachine new. をdo it。->Error:UndefinedObject cannot be changed
どんなもんでもinstanceになるわけではないのか..。
テキスト「自由自在Squeakプログラミング」登場。
morph2 := Morph new openInWorld.
同じエラーメッセージが出た。そもそも考え方が違うってか。

94 :デフォルトの名無しさん:2006/05/05(金) 11:27:38
>>91
ちなみに TelnetMachine は TelnetMachine open の do it (alt/cmd + d) で
ウインドウが開きます。TelnetMachine class >> #open の定義は、ブラウザの
上段第2ペイン下の class ボタンを押して切り替えることで見ることができます。

98 :デフォルトの名無しさん:2006/05/05(金) 23:20:45
>>94
> ちなみに TelnetMachine は TelnetMachine open
たしかにopenで成功しました。そこで質問ですが、

・なぜ「open」という存在を知っていたのか、
・それがインスタンスでなくてクラスである理由

は なんでしょうか?判る範囲で構いませんのでゼヒ。
ちなみに、Morphにおける「new」というメソッドはMorphでも、そのSuperclassである
ObjectでもさらにそのSuperclassであるProtoObjectでも定義されていないんですが、
なぜ有効なんでしょう。

135 :デフォルトの名無しさん:2006/05/24(水) 22:55:17
長文失礼。書き込みたかっただけ。

コトの発端は、
Smalltalk keysDo: [:each |Transcript cr; show: each].
で、システムに登録されたキーをすべて表示したとき、途中を見たかったが、
量が多いし辞書順に出力されるわけでもないんでバックスクロールが面倒だったこと。

select:とか使えば見たい部分を引っ掛けられるんだが、「なんとなく見たい」場合は見たい部分を
指定できるハズもない。
windwowsなら中間ファイルにリダイレクトしてエディタで開く。unixならパイプでless起動。
squeak的にはどんなアプローチが『普通』なんだろう?

squeakではファイルという存在が見えにくい。ならsqueak的にデータは
どこに格納すべきなんだ。やっぱり生データではなくオブジェクトにする
んだろうか。すべてのオブジェクトは生きている(動いている)というのが
元の設計思想らしいので、これに従うと、例えばsqueakにmovieファイルを
ドラッグアンドドロップすると、そのファイルはオブジェクトに自動変換され、
Squeakの画面にある間はずっと再生しつづける、とかかな。オブジェクト4つくらいで
コマ落ちしそう。プロセッサパワーが無限にあると仮定しても、オブジェクトが50とか
あると1画面に入りきらないような気がする。大量のオブジェクトがあった場合、
必要なオブジェクトを探す方法が必要になるね。
いまのsqueakにそんなものってあったっけ。俺が探せていないだけか。

136 :デフォルトの名無しさん:2006/05/24(水) 23:10:35
Smalltalk keys または
Smalltalk keys asSortedArray

を inspect するのはダメ?

147 :デフォルトの名無しさん:2006/06/11(日) 13:38:22
実は作成したいんは

バイナリログファイル->テキストログファイル

です。ハイ。
ファイルの先頭48byteはヘッダで、とりあえず無視します。
そのあとから16byteごとのレコードが続いています。で、レコードは
4つの4byteフィールドからなるっていて、フィールドはその数字に
対応する文字列が別途あり、ここを対応付けるスクリプトを書きたい。

でも4byteの数字をつくることさえ、ままならない。(現時点では掛け算で求めてる)

なお、Cでは簡単にかけちゃうんですが、そこはSqueakを使いたい。
クラス、メソッド、メッセージ。オブジェクト指向って何かがわかるかな??と。

191 :デフォルトの名無しさん:2006/10/23(月) 23:07:45
Squeakを勉強したいのですが、お勧めの書籍を1,2冊教えてください。
C/C++は大体わかります。

196 :デフォルトの名無しさん:2006/11/08(水) 10:38:10
smalltalkでWindowsアプリケーション(VMを使わず起動)を作れますか?
作れるとしたらお勧めの開発環境は何ですか?

197 :デフォルトの名無しさん:2006/11/08(水) 18:31:13
Squeak で windows アプリを作ろう。
ttp://d.hatena.ne.jp/propella/20050925/p1

198 :196:2006/11/10(金) 15:59:32
>>197
ありがとうございます。
なんか、話が変わって申し訳ないんだけど、
SqueakでChessとかのゲームってどうやったらできるの?
インストールしたのは「日本語7」です


242 :デフォルトの名無しさん:2007/06/10(日) 18:38:54
Rubyの作者がSmalltalkっていうときはごく初期のLittle Smalltalkのこと。

273 :デフォルトの名無しさん:2007/06/17(日) 13:08:57
Smalltalkerに上から目線な香具師が多いのは反省すべきだな

274 :デフォルトの名無しさん:2007/06/17(日) 13:31:59
>>273 が上から目線なのがワラタ

単に価値判断基準が違うだけだと思うけどね。
多様な価値基準がある世界に慣れていない人は戸惑うのかもしれないね。

288 :デフォルトの名無しさん:2007/06/19(火) 16:21:32
古株の価値判断って、ファイル・システムに対するオブジェクト・システムのこと?
もはや30年も経った骨董品だから、いい加減Smalltalkはオブジェクト・システムから
脱するべきやな。怠慢もいいところ。

289 :デフォルトの名無しさん:2007/06/19(火) 19:37:20
>>288
で、オブジェクトシステムっていう価値基準は多様なの?www

444 :デフォルトの名無しさん:2008/05/29(木) 23:45:01
いまsqueakで軽いミニゲームを作ってるんだけど
解らないところがあるんだが質問して良い?

445 :デフォルトの名無しさん:2008/05/30(金) 00:37:48
>>444
好きにすれば良い

446 :デフォルトの名無しさん:2008/05/30(金) 02:36:38
>>445
thank

squeak触って間もない初心者だけど
いまシューティングゲームを作っているんだ、
それで自機の弾の連射ができない(´・ω・`)
一発ずつしか撃てないのを改善しようと
4時間悩んでググった結果このスレにたどり着いた。

どうかこのド低脳に解決方法をご教授願えやしませんでしょうか・・・

448 :デフォルトの名無しさん:2008/05/30(金) 10:39:47
>>446
Squeak で作っているということですが、Etoys(ドラッグ&ドロップのプログラミング)でか、
Smalltalk でか(ブラウザとかを使ってクラスとかを定義しているのか)で違うので、
どちらか教えてもらえますか? たぶん、Etoys だとは思うのですが。念のため。

それと、今のところ、どこまでどんなふうに書いたのかを簡単でいいので教えて
もらえると、それに乗っかってヒントも出しやすいです。

449 :デフォルトの名無しさん:2008/05/30(金) 15:50:53
>446
こんな感じ?
http://squeakland.jp/seaside/SBSuperSwiki/85e1abfa-def5-4760-a095-5eb9e62f6e46

538 :デフォルトの名無しさん:2009/02/15(日) 06:22:47
repeatやwhileTrueとかでブロッククロージャから局所脱出させる方法が分からない
^だとメソッド終了しちゃうし・・


539 :デフォルトの名無しさん:2009/02/15(日) 12:47:11
>>538
脱出したいタイミングで例外をあげる処理と #on:do: との組み合わせでは駄目ですか?

| i |
i := 0.
[ [#一連の処理. (i:=i+1) > 100 ifTrue: [Exception signal]. #続きの処理] repeat
] on: Exception do: [:ex | #脱出時の後処理]

542 :デフォルトの名無しさん:2009/02/16(月) 07:58:47
>>539-540
ありがとうございました。
にしてもon: do:はprimitiveっぽくて中身見えず
valueWithExitは何をやってるかさっぱり

Cのbreakやcontinueに相当するものがよくある解説にはまったく出てこないのはどうしてなんだろう?
そういえばcontinue相当がまだ見つからない・・
ブロック内でself value. とかしたら再帰になっちゃいますよね。

588 :デフォルトの名無しさん:2009/03/27(金) 19:48:19
じゃあ早速質問。
1. ブロッククロージャの実行環境というのは
無名のメソッドコンテキストであるという理解でいいのですか?
この場合ブロッククロージャ内に現れるselfの実体は何になるのでしょうか。

2. ブロッククロージャ内で出現する ^ は引数がどんなオブジェクトであれ
現在のメソッドコンテキストを消滅させ、直前のメソッドコンテキストに処理が戻る
という考え方は一般的でしょうか?

3. しかしvalueWithExitの実装を見ると^nil が非常に特殊なものであるように見えます。
これはバイトコンパイルする時に引数がnilである場合にのみ命令の置き換えをしているということでしょうか?

590 :デフォルトの名無しさん:2009/03/27(金) 21:28:08
>>588
> 1. ブロッククロージャの実行環境というのは
> 無名のメソッドコンテキストであるという理解でいいのですか?

違います。
そもそもクロージャにするためにはメソッドコンテキストから独立
させる必要があります。

> この場合ブロッククロージャ内に現れるselfの実体は何になるのでしょうか。

クロージャを包んでいるメソッドの環境でのselfです。

> 2. ブロッククロージャ内で出現する ^ は引数がどんなオブジェクトであれ
> 現在のメソッドコンテキストを消滅させ、直前のメソッドコンテキストに処理が戻る
> という考え方は一般的でしょうか?

はい。

> 3. しかしvalueWithExitの実装を見ると^nil が非常に特殊なものであるように見えます。
> これはバイトコンパイルする時に引数がnilである場合にのみ命令の置き換えをしているということでしょうか?

それはメソッドコンテキストが特殊なのではなく、nilがバイトコードにおいて特殊なだけです。

592 :デフォルトの名無しさん:2009/03/27(金) 22:49:52
>>590-591
即解答ありがとうございます。
新たな疑問が沸いてきました。

6. ブロッククロージャが新たなメソッドコンテキストを生成するものではないなら
^ が発行された時点でメソッドコンテキストが消滅するので
valueWithExitが成り立たないのではという考えに至りました。
しかし実際には機能します。
これはどういうことなんでしょうか?

7. [^nil] value と [^aObject] value で機能的に違いがあるのでしょうか。


5.についてはSmalltalkCompilerが難解なのでざっと見た感じですが
おそらくブロッククロージャのレシーバを除いて
引数のブロッククロージャは例外無くすべてインライン展開されるのではないかと思いましたが違いますか?

593 :デフォルトの名無しさん:2009/03/27(金) 23:49:56
>>592
Squeakで MessageNode >> initialize を見ればいいと思うよ


596 :デフォルトの名無しさん:2009/03/28(土) 09:53:32
>>592
あまり思い込み&先走りせずに、おちついて考えてみてはいかがでしょう。
あと、#repeat のときと同じで、どうしてそういう結論にいたったかを
書いてもらえるとくい違いを指摘しやすいと思います。

#valueWithExit のどちらの ^ について成り立たないと判断されたかわかりませんが、
いずれの ^ でも #valueWithExit をコールしたコンテキストに戻るので
(そしてそれは消滅していないので)問題はないと思いますが、違いますか?

7. については、文面どおり呼び出し元への戻り値が nil か aObject かの違いだけです。

5. については、具体的には SmalltalkCompiler のどのメソッドの記述から、
引数のブロッククロージャは例外なくインライン変換されると結論されたのでしょうか?

597 :デフォルトの名無しさん:2009/03/28(土) 18:44:10
>>596
成り立たないと思ったのは、ブロッククロージャの実行環境が無名メソッドコンテキストではないということは
任意のクラスメソッドを呼んだ時、そこにはいくつブロッククロージャがあっても
クラスメソッドを呼んだ時に生成されたメソッドコンテキストしか存在していないと思ったからです。
であれば、valueWithExitの機能は成り立たたず、通常の^と同じで発行された時点でメソッドの呼び出し元に戻ってしまい
valueWithExitの外に戻ってはこないと思っています。
ここの所がどうもひっかかっています。

7.ですが、ということは[^nil] valueだけが非常に特殊なものというわけではなく、例えば[^Object ] valueとしてもvalueWithExitとまったく同等の機能になるということですか?

5.はifTrueなどのメソッド名がどこにも書かれていなかったので、引数のブロッククロージャはすべてインライン展開されるのでは、という予想です・・
特定のメソッド名で束縛してインライン展開をしているのでは、というこれも予想ではあったのですが・・

>>593-594
ここに記述されているメソッドがインライン展開の対象になるということでしょうか。





653 :デフォルトの名無しさん:2009/06/21(日) 20:48:06
VisualWorksで.im形式のファイルの使い方が分かりません。

ファイルを取り込んだら文字化けしてしまいます。
Windowsでは使えない機能なのでしょうか。

654 :デフォルトの名無しさん:2009/06/21(日) 20:59:35
>>653
virtual machine(visual.exe)にvirtual image(.im)をのせるとVisualWorksが起動する。

>ファイルを取り込んだら文字化けしてしまいます。

いったい何をしようとしたの?

684 :デフォルトの名無しさん:2009/08/07(金) 17:37:53
VisualWorksですが

メソッドをこう定義して
element:aData

aData := 'points'.

^self

とかやってsaveしようとすると
Attempt to store into argument
と出てaDataを書き換えられないような感じです
VisualWorksは引数の書き換えを禁止しているのですか?
逆に引数の書き換えをするにはどう書けばいいのでしょう。

685 :デフォルトの名無しさん:2009/08/07(金) 18:41:32
thisContext localAt: 1 put: 'points'.

689 :デフォルトの名無しさん:2009/08/07(金) 20:29:36

でもって今書いているのはこんなものです。
呼び出し元でn1,n2,d1を使用しているので呼び出し先で書き換えてくれないと困るというか・・
VisualWorksではもっと適切な書き方があるんでしょうか?

patternNND:aString name:n1 name:n2 digit:d1

| m |
m := RxMatcher forString:'�\s*(�\w+)�\s+(�\w+)�\s+(�\d+)�\s*'.
( m matchesPrefix:aString) ifFalse:[^False].
n1 := m subexpression:2.
n2 := m subexpression:3.
d1 := m subexpression:4.
^True.



690 :デフォルトの名無しさん:2009/08/07(金) 21:08:33
ああそういうことなら
n1 become: (m subexpression: 2).
とか書けばいいです。become:はポインタの指す先を入れ替えるメッセージです。
超便利なので使いまくりましょう。

あとTrue, Falseはクラス名なので真偽値をあらわすにはtrue, falseと小文字で書きます。

692 :デフォルトの名無しさん:2009/08/08(土) 14:39:32
>689
この場合はbecome:を使うまでもなく、センダ側で、

arrayOfPattern := Array with: aString with; n1 with: n2 with: d1

みたいにして引数の配列を作っておいて、

patternNND: arrayOfPattern

で呼べばいいのでは。受け取った側では、

arrayOfPattern at: 2 put: (m subexpression: 2).

みたいにして書き換えます。名前付がいいなら配列じゃなくて辞書にする
とか、パタン自体がオブジェクトになる可能性も検討すべきかと(本当に
必要かどうかは設計の問題)。

become:は強力すぎるので、その使用は最低限にすべきでしょう。

695 :デフォルトの名無しさん:2009/08/09(日) 06:26:49
>>692
ダメだよそれじゃ。
配列なんかで渡したら、各パラメータの意味がわかりにくいでしょ?
Perlじゃあるまいし。
漢なら、パラメータは辞書渡し。これならオプション引数まで扱える。
これを使いこなしてこそ、Smalltalker中のSmalltalkerと言える。

697 :デフォルトの名無しさん:2009/08/09(日) 11:50:06
漢の中の漢、ならまだ意味が通る

699 :デフォルトの名無しさん:2009/08/09(日) 18:36:16
>>697
ValueHolderを使えというわけですね
わかります。


702 :684:2009/08/09(日) 22:23:41
色々と試行錯誤してみましたが
なかなかうまくいきません・・

>>685
コンテキスト内は有効みたいですが、呼び出し元でinspectしても
値はまったく変化しないようです。
これではちょっと・・

>>690
becomeはmodifyエラーが出て使えませんでした。
どんな時に有効か教えて頂けませんか?
これで解決するなら本当にありがたいです。

>>692 >>695
配列や辞書渡しは勘弁して下さい・・

>>699
呼び出し元でaValue := (ValueHolder with:aObj)で渡し
呼び出し先でaValue setValue:'ex'. とかすると
呼び出し元でaValue value inspectで正しく変化していることが確認できました。

とはいえ引数をValueHolderでラップして渡すまでもなく
直接変更を加えたいというのが本音なので・・

そもそもどうして引数に対し := で直接書き換えさせてくれないんでしょう。
不便で仕方がないと思うんですが・・
何か理由があってこうしてるんですか?


http://hibari.2ch.net/test/read.cgi/tech/1131349633/l50人気ブログランキングへ