Smalltalk総合 Squeak Pharo
>>215 「Smalltalkの底が知れた設計思想」だね。10回読んでみるわ クラスライブラリの実装見ると たいてい使える機能から予想するよりも 短い記述になってる印象なんだけど なんで? 文法が簡潔で記述量が少なく書けるから? 書き手がOOマスターしてるから? それとも継承しまくってるから (継承を追って見るくらいはしてる) 総量は多くても個々が少なく感じるだけ? じつはシステムブラウザから見えない部分 (インライン)で下処理を済ましてるから? >>220 本当に実装量程度の機能かもしれないし、 からくりがある場合もある。 具体的には、どのクラス?(できれば処理系も) >>217 基本的にGNU SmalltalkにAndroid用の追加Packageがちょこっと乗ってるだけ。 GNU Smalltalkの部分はLinuxやWindows上と使い勝手は変わんないよ。 因みにGNU Smalltalkは方言が激しすぎると思うかもしれないけど、 他の環境と同じような書き方もできるよ。 "Smalltalk User Exampleといい名前空間を作る。" Smalltalk addSubspace: #User. Smalltalk User addSubspace: #Example. "Smalltalk User Example に移動する" ! Namespace current: Smalltalk User Example ! Object subclass: #Someoen instanceVariableNames: 'name' classVariableNames: '' poolDirectory: ''. "ClassのInstance変数の登録(省略可)" Someone class instanceVariableNames: ''. "name変数の読み書き用Method登録。defaultは初期値" Someone createSetMethod: 'name'; createGetMethod: 'name' default: ''. "Instance用のMethod登録" ! Someone methodsFor: 'example' ! something ^ '何か処理を書く'. !! "Class用のMethod登録" ! Someone class methodsFor: 'instance creation' ! withName: aString ^ self basicNew name: aString. !! "現在の名前空間を変更して保存すると、名前空間が変更しっぱなしになるので戻す。" ! Namespace current: Smalltalk ! " Imageに保存。引数を指定しなければ/mnt/sdcard/ls4a/gst.imに保存される。 元のgst.imはどこかに保存しとくこと。 " ObjectMemory snapshot. GNU Smalltalkの注意点 1. 親の名前空間が持っている名前空間を子の名前空間は作れない ダメな例 Smalltalk Test Something Test. 大丈夫な例 Smalltalk SomethingA Test. Smalltalk SomethingB Test. 代わりに子の名前空間から親の名前空間を参照するとき 参照する親より上の名前空間を省略できる。 Smalltalk Test Something ExampleAという構成の時ExampleAから TestのClassをExampleBを参照するとき 下記のいづれでも参照できる。 ExampleB Test ExampleB Smalltalk Test ExampleB 2. 大文字で始める変数、または大域は宣言してないとnilになる。 つづりを間違えた時に結構ハマる。 Method内で書いた小文字の変数は宣言が無いと翻訳失敗になる。 また、名前空間をSmalltalk.Something.と「.」で区切れば、 親の名前空間が存在しない時翻訳失敗にしてくれる。 ただし、最後の名前空間名やClass名まで存在するか見てくれない。 3. 例外を捕まえるClassの種類ににExceptionから派生した Class以外を指定すると訳の分からない例外になる。 [ ] on: NotFound "NotFoundが存在しない場合nilになっており例外処理が暴走する。" do: [ :exception | ]. 4. nilを継承できる。nilを継承するとMessageに 存在しないMethodを指定されてもErrorにしない。 "SuperSomethingは実はnilだが継承できてしまう。" SuperSomething subclass: #Something. "helloは無視される。" Something new hello. ただし、nilを継承すればあらゆるMessageを doesNotUnderstaedで受け取ることができるいう利点もある。 Objectを継承しているとObjectが実装しているMessageは受け取れない。 sl4aでGNU Smalltalkを使う時のヒント。 GUI は下記のような感じで作ることができる。 PackageLoader fileInPackage: 'Android'. | os event | os := Android. "UI表示" os fullShow: '<?xml version = "1.0" encoding = "utf-8" ?> <LinearLayout xmlns:os = "http://schemas.android.com/apk/res/android" ; os:layout_width = "match_parent" os:layout_height = "match_parent" os:orientation = "vertical" > <EditText os:layout_width = "match_parent" os:layout_height = "wrap_content" /> </LinearLayout> ' "Event待ち" event := os eventWait. >>221 処理系はSqueak クラスは「Kernel-」系のクラス こんなコアな部分でもこれだけで済むの? ってのが素朴な疑問だった (とくに昔の)C++とかのソースだと 1ファイルに何千行もドバッと書かれてるから 小分けで錯覚してるだけかもしれないけど 自力で分かったのは Kernel-Objects BooleanのifTrueが インライン展開されてるから書かれてないってこと >>227 > Kernel-Objects BooleanのifTrueが > インライン展開されてるから書かれてない もし Boolean >> ifTrue: のことなら、処理が書かれていないのではなくて、 self subclassResponsibility 、つまりサブクラスでオーバーライドせよというコードで指示がされているだけで、 実際にそれに従い、True >> ifTrue: 、False >> ifTrue: の方に(普段はインライン展開されてしまうので 無視されますが、明示的にコールしてやりさえすれば)動くコードが書かれています。 たとえば True >> ifTrue: メソッドは、こんな風に明示的にコールできます。 true perform: #ifTrue: with: [3] "=> 3 " True >> #ifTrue: valueWithReceiver: true arguments: {[4]} "=> 4 " 他のインラインされるメソッド群は MessageNode class >> initialize で確認できますが、 (Kernel-Objects MessageNode の class 側に切り替えてでてくる initialize メソッド定義内) whileTrue: を除いては、前述の ifTrue: 同様、明示的にコールしても 動くコードで書かれているので短い記述になっていることにはあまり寄与していないように思います。 そういう意味では Float >> + のように <primitive: 41> などといった記述があるメソッドは 実処理が仮想マシンやプラグインにあるので、具体的なソースは書かれていないことになります。 これはちょっとコード量の削減に寄与しているかもしれません。 余談ですが、<primitive: 41> などの後に書かれているのは、仮想マシンなどに記述された関数のコールが 失敗した場合に実行されるフォールバックコードで、これは Smalltak で記述されています。 個人的には Smalltalk のコードが短く感じるのは、出来ることの印象に反して 実質的にはコード量なりの機能しか実装されていないからだと思います。 C++ などで書かれたものと厳密に(たとえば数理学的に)同等の機能を記述しようと思ったら それなりのコード量になるのではないでしょうか。 >>228 うわー詳しい! 触ったばかりとはいえ雑な理解で恥ずかしいです^^; >実質的にはコード量なりの機能しか実装されていない パッと見で気づかれないていどに うまく手を抜いてるってことですかね たしかにC++みたいな巨大な仕様の言語と 細部の挙動が違うのは想像できます もしそれが気に入らなければ Smalltalkは仕様自体をカスタマイズできるんだし YAGNI的にも開発リソース的にも それが現実解の気がします なぜそこが気になったかというと 少ないコード量で実現してるというのは 設計の参考になるからです 正直、どうしてこんないい加減なものが動くのか、私もかねてから不思議に思っています。^^; まあそこが興味の対象であり、数理学的に論じると味わいのなくなる面白いところでもあるわけですが。 手抜きのことも含めて、もちろん他にも短く書くための工夫らしきことはあるので もう少し、システムの中身を覗いてみてください。 設計の参考ということでは、しばらくいじってみて興味をひかれた機能を その動作から実装を予想し、実際にそう実装されているか確認してみると 「その手があったか!」というような発見もあって楽しみながら学べると思います。 (あるいは時間の無駄で終わるかもしれませんが…) 個人的によくお薦めするところでは、print it(式を選択して右クリックメニューなどから print it すると返値が挿入される機構)がどのように実装されているか、コンパイラの 実装やその動作などと併せて予想・確認してみるのは比較的よい題材かと思います。 >>230 >どうしてこんないい加減なものが動くのか 不思議ですよねー 古くからあるから職人芸なのかな 記述が短いから拡張や改造が楽で 助かる面はあります >実装やその動作などと併せて >予想・確認してみるのは比較的よい題材 それは良さそうですね じっくり取り組んでみます >>228 value := 1 < 2 ifTrue: 3 asValue ifFalse: 4 asValue. こんな場合もInline展開されないでしょ。 VisualWorksだと最適化しないって警告がでる。 >>222-226 > 基本的にGNU SmalltalkにAndroid用の追加Packageがちょこっと乗ってるだけ。 > GNU Smalltalkの部分はLinuxやWindows上と使い勝手は変わんないよ。 それならSmalltalk使う意味あるね ほかの処理系でももっと出てきて欲しい WindowsPC全盛期はマルチプラットフォームに あんま魅力感じなかったけど 今みたいにPCもスマホもでOS乱立してると 同じように書けることって大きいと思う PCはC++かC#で WebアプリはPerlとかPHPで AndroidはJavaで iPhoneはObjective-Cでとか 覚えることがあまりにも多すぎる PCもWebもスマホも 同じ言語で書けたら楽だなと思う まあその本命は一昔前ならJavaだったし 今ならJavaScriptなんだろうけど >>231 長い時間をかけたリファクタリングの結果です。 >>232 あ、ほんとだ。ブロックリテラルで書かないと、インライン展開されないんですね。…とのことです。>>229 true ifTrue: [3] ifFalse: [4]. thisContext method symbolic "=> '33 <71> pushConstant: true 34 <99> jumpFalse: 37 35 <21> pushConstant: 3 36 <90> jumpTo: 38 37 <20> pushConstant: 4 38 <87> pop 39 <89> pushThisContext: 40 <D3> send: method 41 <D2> send: symbolic 42 <7C> returnTop' " true ifTrue: 3 ifFalse: 4. thisContext method symbolic "=> '33 <71> pushConstant: true 34 <21> pushConstant: 3 35 <22> pushConstant: 4 36 <F0> send: ifTrue:ifFalse: 37 <87> pop 38 <89> pushThisContext: 39 <D4> send: method 40 <D3> send: symbolic 41 <7C> returnTop' " | block | block := [3]. true ifTrue: block. thisContext method symbolic "=> '<略> 36 <71> pushConstant: true 37 <10> pushTemp: 0 38 <E1> send: ifTrue: 39 <87> pop 40 <89> pushThisContext: 41 <D3> send: method 42 <D2> send: symbolic 43 <7C> returnTop' " >>232 調べてみました。なるほど。 引数がブロックかどうかをチェックしてインライン化を判断しているのですね。 (以下は Squeak の場合ですが、VisualWorks でも似たようなことをしていました。) MessageNode >> transformIfTrue: encoder (self transformBoolean: encoder) ifTrue: [arguments := Array with: ((arguments at: 1) noteOptimizedIn: self) with: ((BlockNode withJust: NodeNil) noteOptimizedIn: self). ^true] ifFalse: [^false] MessageNode >> transformBoolean: encoder ^self checkBlock: (arguments at: 1) as: 'argument' from: encoder >>235 自作ClassのObjectに対してはMessage送信省略しないお陰で、 数値計算に自作ClassのObjectをツッコむことができるんだよね。 以下はGNU Smalltalkの例。 nil subclass: #NumberDelegator instanceVariableNames: 'delegate' classVariableNames: '' poolDictionaries: '' category: 'Example'. ! NumberDelegator methodsFor: 'accessing' ! delegate: aNumber delegate := aNumber ! generality "primitive扱いされると例外を吐くことになるので、primitive扱いできないようにする。" ^ 0. !! ! NumberDelegator methodsFor: 'forwarding' ! doesNotUnderstand: aMessage ^ aMessage sendTo: delegate. !! ! NumberDelegator class methodsFor: 'instance creation' ! forwardTo: aNumber ^ self basicNew delegate: aNumber. !! | result | result := 1 + ( NumberDelegator forwardTo: 10 ). >>237 言いたいことがよく分かりません。 それはコンパイル時の ifTrue: 、whileTrue: などのインライン展開とどういう関係があるのでしょうか? そもそも 1 + 10 と 1 + MyClass new とではコンパイル結果は変わらないですよね? そのコードも SmallInteger >> + のプリミティブが失敗して普通にフォールバックしているだけだと思うんですが… >>234 Smalltalkならではの伝統ですね 新しい言語だと何十年もリファクタリングした コードを見る機会はないし >>235-236 >引数がブロックかどうかをチェックして >インライン化を判断している インライン化とそうでない処理に分けることについて なぜそうするか、思いついたメリットとしては インライン化のほうが早いだろうけど もしインライン化しかないと ifTrue系の命令を自分で改造するのが大変だからかな IDEが使いやすいので C++やJavaでも こういうIDEないかな? 他言語でも同様のものを作れなくはないと思うのですが Smalltalk環境の機能自体があまり多くの人に知られていないのと 他言語では同様のものを(Smalltalkほどには)簡単には 作りにくいのかもしれませんね。 Clojure 向けですが、最近ではこんなIDEが話題になっていました。 http://cloxp.github.io/cloxp-intro.html 補完とか名前変更とかSmalltalkのIDEはウンコすぎるじゃん 本当に開発してると一番差が出るところなのに 本当にJavaやC++のIDE使った事あんのかよ (…補完も名前変更も一発なのにこの人は一体何を言っているのだろう…) (…そもそもこの人が言うSmalltalkのIDEとは何を指しているのだろう…) 無関係な候補が補完されたり、無関係な名前まで変更されてしまうゴミじゃん 粘着アンチ君、まだいたのか。 他言語で幸せになれなかったのかな…。かわいそうに。 >>244 この人は補完の精度のことを言っているんですよ。 動的型言語である以上、どうやったって精度はだせない。 よって、補完がないとコード書けないユーザーにはウンコで使えない、と。 >>241 > 他言語では同様のものを(Smalltalkほどには)簡単には作りにくい Smalltalkは最初からGUIのことまで考えて言語が設計されてるからかな >>242 まだ一般人が使えるようにはなってないのかな >>245 ちなみにおれが言ってるほうのIDEはSqueakね まあ静的型付けほどの精度はないし 多機能さとか総合力でスコアつけたら VSとかメジャーなIDEのほうが上だろうよ でも主観的な使い心地はすごい良く感じる 純粋OOPLとか動的とかイメージベースとか いろんな仕様がかみ合ってるから使いやすい 逆にVSっつーかC++は かみ合ってないから疲れる そもそもIDEよりエディタで気軽に書くほうが 好きだったりするんだけど Smalltalkに関してはIDEじゃないと魅力半減 >>249 > Smalltalkは最初からGUIのことまで考えて言語が設計されてるからか たしかに GUI の扱いやすいさもひとつにありそうですが、個人的にはそれに加えて Smalltalk(というかアラン・ケイが)重要視して、他言語では良くない余計なものとされる オブジェクトの全能性(というと語弊があるので「訊けば答えてくれる感」?)も重要だと思っています。 たとえば、ブラウザ機能を実現するのに必要なクラスに定義されたメソッドの一覧や メソッドのソースは、それぞれクラスやメソッド自身に尋ねればこんなふうにして 簡単に得られます。(後者は Squeak の場合) Integer selectors (Integer >> #factorial) getSource リフレクションの API が充実しているだけと言われればそれまでですが、 (先だってのコードの短さともからめて)そういう切り口ではない、環境内のオブジェクト間の連携を しやすくする工夫の結果としての IDE の使い勝手であるような気がします。 「無関係」の定義もなく「変更されてしまうじゃん」とか断言する人って、技術的な議論には全く向かないよね。 彼はSmalltalkをコケにすることができれば満足で そういう次元の議論は1ミリも望んでいないでしょう。 それはさておき本気を出せばSmalltalkでも 補完くらいなら、そこそこの精度は出せるでしょうね。 Smalltalkを覚えたいのだが本業のドカタ仕事に忙殺されてなかなか出来ぬ。 人生は短すぎる。 で、Smalltalkerさん達の本業は何よ? >>253 ID:KJLqYxlY の心の平安のために精度は今のままの方がよさそう。w >>251 > オブジェクトの全能性 たしかにC++のクラスが抽象データ型の延長なのに対して Smalltalkではより能動性とか主体性を持たせようとしてますね C++だとメモリ管理とかとあわせてクラスの管理をいろいろ プログラマが抱え込まないといけないからストレスになる Smalltalkはブラウザ関係もふくめて メッセージングに任せられる部分が多いので ストレスが軽減されていると感じます C++(とVS)は多機能で高性能なんだけど それだけプログラマの負担も大きくて Smalltalkはそれよりさらに高性能というよりかは 使用者が使いやすい方向を目指してる感じ >>259 土方のお仲間じゃないですか。 Smalltalkの受託やってるの? >>238 GNU Smalltalkだと定数の演算とかは糞真面目に計算せずに、 翻訳時にすませてるっぽいよ。 この辺も最適化の過程でMessage送信が必要かどうか判断してるんじゃない? >>239 原則Message送信であってif文の構文糖じゃないからね。 最適化はあくまでもオマケ。 最適化し辛い構文があってもMessage送信の原則は守る必要があるんでしょ。 >>251 Squeak以外は使わないの? VisualWorksとかPharoとかは、補完するSelectorを結構絞り込んでくれるから便利よ。 VisualWorksはCincom本社の海外サイトで個人情報入れなきゃなんないのが面倒だけど。 >>264 > GNU Smalltalkだと定数の演算とかは糞真面目に計算せずに、 > 翻訳時にすませてるっぽいよ。 それは分かりましたが、それを踏まえてもなお >> 237 > 自作ClassのObjectに対してはMessage送信省略しないお陰で、 > 数値計算に自作ClassのObjectをツッコむことができるんだよね。 が出てきた理由がまだよくわかりません。 なぜあえてこの例が必要だったのか(Squeak の話をしているときになぜあえて GNU Smalltalk か? 非リテラルオブジェクトではなくなぜあえて自作クラスなのか? さらになぜあえて nil を継承したのか?)、 それぞれによって、どんな理解が進むのかについて少々かみ砕いての解説をお願いできますか? 64bit VMがlinux版しかないのはどういうわけ >>267 1. SqueakではなくGNU Smalltalkを例に出した理由 Squeak限定じゃなくSmalltalk一般の話かと思いまして 処理系について意識してませんでした。すみません。 2. 数値計算の最適化を上げた理由 Message送信が最適化で省略されない場合の利点を 説明するつもりで書きました。 #ifTrue:ifFalse:で有用な例を示さなかったのは すぐ有用な用途が浮かばなかったからです。 3. なぜ既存のClassではなく自作Classを例に使ったか 最適化が適用されない既存のClassが 思いつかなかったからです。 SqueakやPharo基準で考えれば、 自作じゃなくてもCollection系で良かったですね。 レスを書いた時は思いつきませんでした。 4. なぜnilを継承したか Objectを継承すると、ObjectがMethodを実装しているMessageを #doesNotUnderstand:で委譲できなくなるためです。 SqueakではProtoObjectを使いますが、 GNU SmalltalkやVisualWorksではnilを使います。 5. 何について理解が深まるか 最適化はオマケなので、最適化されるMessageだからと言って 必ず最適化される訳ではないし、 最適化によって自作ClassのObjectを渡すと 動かなかったりするわけではない という事が理解いただければと考えています。 >>269 なるほど、よくわかりました。 丁寧な説明をありがとうございます。 1. の早合点はさておき、 はじめから 5. のような簡易な説明を添えていただけていたなら 私ども読み手も視野を広げやすくなるので、今後もご助言を いただけるのでしたら、ご一考いただければさいわいです。 Smalltalkの新しい書籍 出る予定ないのかな fileURLは使ったことあるけどまさかのhttpもstreamで取れるとは思わなかった 読み込めなかった時のSignalの扱いはわからんがちょっと考えてみるか・・ | aURL aStream aList aLine | aURL := URL fromString:'http://anago.2ch.net/moeplus/'. aStream := aURL readStream lineEndAuto. "withEncoding:#shiftjisは通らない" aList := OrderedCollection new. [ aStream atEnd] whileFalse:[ aLine := aStream upTo:(Character cr ). aList add:( aLine asByteArray asStringEncoding:#shiftjis ) ]. aList inspect. GNU SmalltalkにSmalltalkのVM上で Javaを動かすPackage、その名もJavaがあった。 .jarを読み込んでくれず.classを取り出さないとダメだったり、 Java7には対応してなかったりと微妙な出来だけど、 JavaのClassが完全にSmalltalkのClassとして取り込まれてる所が面白い。 他にも誰が使ったことある人いる? >>270 端からは、あなたがもうちょっと謙虚に聞けばよかった、と見えますよ。 >>264 興味があって調べてみたのですが、GNU Smalltalk で定数同士演算(たとえば + 演算)で メッセージ送信が省略されているのかが ideone.com の処理系では確認できませんでした。 「翻訳時」を「コンパイル時」、つまり「バイトコード変換時」と読み取ったのですが バイトコードレベルで省略されているという話ではないのでしょうか? メッセージ送信が省略されていることの確認の方法を教えていただければさいわいです。 UndefinedObject extend [ plusLit [^3+4] plusNonLit [^3 + OrderedCollection new] ] (UndefinedObject >> #plusLit) inspect printNl "=> [1] source code line number 2 [3] push 3 [5] push 4 send 1 args message #+ [7] return stack top " (UndefinedObject >> #plusNonLit) inspect printNl "=> [1] source code line number 3 [3] push 3 [5] push Global Variable {Smalltalk.OrderedCollection} [7] send 0 args message #new [9] send 1 args message #+ [11] return stack top " http://ideone.com/zWMggc >>276 For some pairs of receiver classes and special selectors, the interpreter never looks up the method in the class; instead it swiftly executes the same code which is tied to a particular primitive. https://www.gnu.org/software/smalltalk/manual/html_node/Performance.html >>277 ありがとうございます。 >>264 の「翻訳時にすませてる」を、3+4 を 7 にする!? と勘違いしていました。 #+ などは特殊なバイトコードを使用し、そうした特殊なバイトコードでは引数の組み合わせ次第で レシーバー(この場合 3)へのメッセージ送信は行なわない、ということですね。 別件ですが、メソッドにコードされたプリミティブが #perfom: 等でコールされたときのためとは 知りませんでした。 そうすると、3 + 4 時は VM 内の + 関数で処理され、 3 + OrderedCollection new 時は + 〜 (バイトコード的には + )が 3 に送られて そこでプリミティブ記述により改めて VM 内の + 関数がコールされ それが失敗してフォールバックコード(たとえば ^super + aNumber)が実行される、 という理解で合っていますか? >>278 > 3 + 4 時は… 自己レスです。(Squeak で、かつ旧 VM でですが)どうなっているか調べてみたら、 VM 内でプリミティブとしてコールされる + 関数(Squeak の場合 primitiveAdd )と バイトコード実行時にコールされる + 関数(同、bytecodePrimAdd )は別物なんですね。 通常は bytecodePrimAdd がコールされ、整数/整数とかでなければメッセージを送信、 #perform: などで呼んだ場合は primitiveAdd がコールされ、それが失敗すると プリミティブに続いて記述してあるフォールバックコードが実行されるというカラクリでした。 似たようなことに興味を持つ人もいるかもしれないので参考まで。 http://askoh.com/mwiki/images/b/be/InterpreterSimulator.zip が >>279 を調べるときに使った Squeak の処理系です。 インタープリターシミュレーターが同梱されているので解凍、Squeak 3.9 仮想イメージ向けの VM を 用意して起動(Simulator.image の方)後、ワークスペースの式を評価することで動かせてお手軽です。 http://vm-dev.squeakfoundation.narkive.com/vxckeGXt/simulate-3-4-with-interpretersimulator にもありますが、bytecodePrimAdd ではなく primitiveAdd のほうに self halt を仕掛けるのが ミソのようです。(bytecodePrimAdd は当然ですがしょっちゅう呼ばれるので…) >>184 >SqueakだとWindowsの.exe作る方法もあったと思うけど ちょっと前の話だけど これをずっと探してて見つけられなかった Visual Worksならできるっていうのは分かったけど SqueakでWindowsの実行ファイル作る方法は見つけられなかった いや実際にSqueakでexeを吐いてるけどって人いる?Think different? by 2ch.net/bbspink.com 今Windowsの環境ないから確認できないけど http://d.hatena.ne.jp/propella/20050925/p1 こことか、リンクのとことか。やったのだいぶ前だけど。 >>283 できた! サンクス! エントリ自体は前に見たことあるけど ウゴモーフとか興味なかったから 流し読みしてしまって見落としてた exe化はできたけど もうひとつやりたいことがあるんだ リリースしたアプリをユーザがいじっておかしくしないように ハローとか開発環境の部分を隠蔽することってできる? http://wiki.squeak.org/squeak/518 ここのcs.gzをDLして、解凍してできたcsをinstall。 Workspaceで Preferences disableProgrammerFacilities をdo it したら、警告ウィンドウ出るのでYes、保存する新しいimage名を指定。 保存したimageを起動すると、望みの動作になってるはず。 >>286 おおすばらしい! ありがとう! まだメニューが残ってたりするけど これでだいぶ普通のアプリっぽくなった できないと勝手に思いこんでたけど 同じところでつまづいた人多そう Smalltalkそのものは大変すばらしいので 日本語情報さえあればもっと広まるのに ああ試してたらメニューバーも消せたわ ワールドメニューがちょっと残るけど ほとんど普通のアプリと変わらない >288 >ワールドメニューがちょっと残るけど 中ボタンで出るyellowButtonMenuのことかなぁ PreferenceのSearch preferences forでgeneralizedYellowButtonMenuを検索して表示して enableをオフにしたら出なくなるけど >>289 できた! 何度も世話を焼かせてしまってすまない これでタイトルバーにねずみのアイコンがある以外は 普通のWinアプリと同じ何もないところまで来たんだけど…… だけどメニューバーも黄ボタンメニューも ほかのワークスペースとかもなくした状態で どうやってイメージ保存してexe書き出しすればいいんだろう? なんか一休さんのびょうぶから虎を追い出せ みたいなとんち状態になってきた >>290 >>これでタイトルバーにねずみのアイコンがある以外は >>普通のWinアプリと同じ何もないところまで来たんだけど…… Preferenceの Show world main docking bar のenable のオフでバーごと非表示にならない? Windows持ってないから状態わからないけど 最後のとんち状態は そうだね...解決策はありそうだけど >>291 >オフでバーごと非表示にならない? ねずみアイコンが2つあって メニューバーのほうはまるごと消せるけど タイトルバーのほうは残る それでデバッグ項目みたいのが残る Winしか持ってないから 他OSとの違いは分からないが でもライセンス的にMITだから Squeakを使ってること自体は どこかで教えないといけないので これでもいいよ >>291 exe書き出しのとんちのほうは アイディアが色々あるので試してみる 超初心者だから時間かかるだろうけど 他言語の経験はあるから 少しずつ調べながらやってみる 最後は自分で何とかしたいと思う 長々と付き合わせてしまって申し訳なかった >>293 こちらこそ久々にいろいろやってみて、いろんな機能を知って面白かった >>256 >SqueakのCトランスレータが結構使える 一行レスだから見逃してしまってたけど 今スレ見返してたらすごい面白そう VMの埋め込みとかで触れないのかと思ってた 普通にワークスペースから使えるものなの? クラス名とか検索するための単語なにか教えて >>295 レスが付かないから自分でザッと調べてみたけど >>256 で言うCトランスレータというのは Slangで書くVMプラグイン機構のことかな? (それとも別の何かがあるなら誰か教えて欲しい) プラグインはしばしば他言語でそうするように DLLみたいなC/C++で書くものという先入観があったから 逆方向でトランスレータとしても使えるのは面白いと思った ただCのソース単体で取り出して 他でコンパイルできるのかとか まだ詳しく調べてないけど >>296 現実的にはslangは単純な整数とか整数の配列の計算くらいにしか使えない 行列とかベクトルの計算とか、その程度が限界 プラグインは普通にcで書くという先入観で正しいと思う >>297 あーそうなんだ、thx Cと自由に行き来できたら便利だと思ったけど 計算で速度稼ぐとか、実用に耐える範囲は限定的か まあ制約が多くても 使えるだけでありがたいけど 下記サイトにオブジェクトの定義が書かれています。 オブジェクト指向プログラミングとは何か? http://eed3si9n.com/node/145 オブジェクトとは何か? 他のオブジェクトへの参照を保持し、事前にリストアップされたメッセージを受信することができ、 他のオブジェクトや自分自身にメッセージを送信することができるアトムで、他には何もしない。 メッセージは名前とオブジェクトへの参照のリストから構成される。 アトムの意味がよくわからないのですが、すみませんがご教示お願いします。 >>299 メッセージを事前にリストアップしないといけないとか、オブジェクトがアトムであるとかは この人の思い込みや勝手な言い換えなので原文(をもう少しマシに訳したサイト)を 当たられることをお薦めします。 http://d.hatena.ne.jp/katzchang/20080807/p2 私が考えるOOPはメッセージング、状態処理のローカルでの保有・保護・隠蔽、 そして全ての物に対する強力な遅延束縛、これだけだ。これはSmalltalkとLISP だけが実現できている。他のシステムでも可能かもしれないが、私は知らない。 >>299 たぶんアトムはLispの用語から取ってるんじゃないかな? でも定義してる中で(一般には)未知の新用語を出すって 筋の良い定義じゃないよね >>300 の原文でも言ってないし 事前にリストアップってのも静的型付けの発想で 遅延束縛を重視するSmalltalkの発想から離れてる アランケイのアイディアと混ぜないで 自分で一から言い直したほうが良い気はする >>300-301 レス、ありがとうございます。 アラン・ケイによる正確なオブジェクト定義の提示ありがとうございます。 Lispのアトムを検索して、これ以上分解できない基本データだと理解しました。 >>302 そこで言ってるアトムは分解出来る機能の集合体なのだから これ以上分解できない基本データではないな 単に個体とかでいいんじゃね ぜんぜん関係ないけどおれアラン・ケイが来日したときサインもらった いいだろう ひさしぶりにスレが動いたから オレもついでに言うけど Smalltalkやってる人がもともと少ないんだけど とくに日本でPharoやってる人ぜんぜんいないな 言語(処理系)は良さそうなんだけど 日本語情報が少なすぎてどうしようもない >>240 Code Browser じゃあダメなん? ttp://tibleiz.net/code-browser/ >>308 おお〜サンクス! こういうのがあるんだ 代替になるか分からないけど触ってみる スタートアップ界の異端児!産業機器 x IT x SmalltalkのSORABITO株式会社 …人材採用のプロ・高野秀敏氏が厳選「いま最も旬なベンチャー」 https://news.thepedia.co/article/1068/ 日本でクックパッドがRubyを広めたように、日本も海外も含めて「SmalltalkといえばSORABITO」となるとおもしろい >>310 >Smalltalkの場合は最も覚えることが少ない言語 言語仕様だけならそうだけど ライブラリまで含めたら 最も覚えることが多い言語になりそうだけどなー まあプロトタイプはSmalltalkで ライブラリ必要な部分はRuby って分担ならわりと妥当だと思うけど Smalltalk の代わりに Ruby とか、よう使わんわ Sakuraエディタでコード書いてPharoのファイルブラウザから読み込ませてたんだけど、直接書けるって教えてくれよ >>313 ああ、そうですよね。すみません。 とりあえず、Pharo by Example でも読んで考え方に慣れてください。 https://ci.inria.fr/pharo-contribution/view/Books/job/UpdatedPharoByExample/lastSuccessfulBuild/artifact/book-result/UpdatedPharoByExample.pdf 英語がちょっと苦手という向きには古いPharo1.1向けですが有志による日本語版もあります。 http://www.smalltalk-users.jp/Home/docs 対応する処理系はこちらから入手可能です。 http://pharobyexample.org/image/PBE-OneClick-1.1.app.zip 展開するだけでインストール可能なはずです(pharo.exeで起動)。 でも慣れたエディタがあるなら、まずはそこからコピペというのもそう悪くないやり方だと個人的には思います。 Smalltalkの組み込みのエディタ機能はおいおい学んで、気に入ればカスタマイズも含めて使えばよいので。 Smalltalk使うなら ワークスペース使うのが一番 Happy birthday Squeak! It has been 20 years! Squeak 5.1 is now available for download. http://squeak.org/ MacでSqueak5.1の右上にある検索使うとvmが落ちてしまう read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる