2010年7月31日土曜日

[Squeak] ボゴソート?

同僚にボゴソートというのいうソート?があるのを聞いたので,作ってみた.
説明を受けた通りに実装したみた.

合っているのかよくわからない・・・.
最悪計算量,無限大ってどうなんでしょうね.

Transcript clear.
x := 10.
box := Array new:x.
1 to:x do:[:v | box at:v put: (1 to: 100) atRandom].
box do:[:v |Transcript show:v; show:Character space. ].
Transcript cr.
c := 1.
counter := 1.
[box size = counter] whileFalse:[
  counter := 1.
  box := box shuffle.
  2 to: box size do:[:i | 
    ((box at: i -1) < (box at: i) )
         ifTrue:[ counter := counter + 1]
  ].
 c := c + 1.
].

box do:[:v |Transcript show:v; show:Character space. ].
Transcript cr;show:'loop counter='; show:c; cr.

ソートとよべるのか? これは,奇跡を待つだけのソートだと思う.

2010年7月26日月曜日

[Smalltalk] Smalltalkの虎の巻

sumimさんがSmalltalkのチートシートを書かれたようです.
個人的には,読む価値がかなりある記事だと思います.

話題の Big Scripting Languages チートシートの Smalltalk の空欄を埋めてみた - Smalltalkのtは小文字です

http://d.hatena.ne.jp/sumim/20100726/p1
http://d.hatena.ne.jp/sumim/20100727/p1

最初見たとき,ちょっと感動しちゃった.

タイトルを虎の巻にしたのは,Eclipseの日本語ローカライズが「チートシート」を「虎の巻」と訳していたからw

[Squeak][Objective-C] へっぽこSqueak SmalltalkユーザによるSqueak Smalltalkで考えるObjective-C その1

私はinputはしてもoutputをあまりしてこなかったので,文章を書くのが下手.
未だに知識がしっかりつかないのは,outputがきちんとできないため.

ということで,需要があるかわかりませんが,へっぽこSqueak SmalltalkユーザによるSqueak Smalltalkで考えるObjective-Cを書いてみます(おそらく大学の身内しか必要ないだろう).

でも,時間がないので,テキトーなメモです.

Hello World

Squeak Smalltalk
Transcript cr; show:'Hello World'.

Objective-C
// file name   ->  test.m
#import<foundation/foundation.h>
int main(void){
  NSLog(@"Hello World");
  return 0;
}

実行方法
Squeak Smalltalk
"Workspaceに記述し,do it"

Objective-C

端末で以下のような方法でコンパイル
$ gcc -framework Foundation  test.m


リテラル
Objective-CはC言語のリテラルが使えます.

コメント
Squeak Smalltalk
ダブルクオーテーションで囲みます.

Objective-C
// または,/* ・・・*/ です.




Squeak Smalltalk
全てオブジェクトとして扱います.

Objective-C
Cの基本データ型の数値とNSNumberクラスのインスタンスがある.
NSIntegerは普通のintまたはlong.


NSNumber *number = [NSNumber numberWithFloat: 1.0];

文字列

Squeak Smalltalk
シングルクオーテーションで囲みます.
'文字列です'

Objective-C
C言語の文字列以外に,NSStringのインスタンスの文字列があります.

ダブルクオーテーションで囲み,先頭に@を付けます.
@"文字列です"

代入
Squeak Smalltalk
 :=

Objective-C
=

文末
Squeak Smalltalk
."ピリオド"

Objective-C
; //セミコロン

メッセージ式

Squeak Smalltalk
'Ringo no Tane' size. "文字列の長さを求める"

Objective-C
[ ] で囲むことにより,メッセージが送信できます.Objective-Cにはメッセージ式による優先順位がない.優先順位は括弧の付け方で決定される.
[@"Ringo no Tane" length]; //文字列の長さを求める

算術演算

Squeak Smalltalk
Smalltalkでは,メッセージ式の優先順位で計算をする.

Objective-C
C言語と同様な優先順位で行なわれる.

カスケード

Squeak Smalltalk
; "セミコロン"


"カスケードなし"
Transcript cr.
Transcript show:'Hello'.

"カスケードあり"
Transcript cr; show:'Hello'.

Objective-C
存在しません.

ブール値

Squeak Smalltalk
true "真,Trueクラスのインスタンス"
false "偽,Falseクラスのインスタンス"
nil "不定"

Objective-C
Bool型はブール値を扱うための方
YES //真を表す定数 0でない値
NO //偽を表す定数 0
nil //nullのオブジェクトを示す.nilはid型の空ポインタ.値は0.

制御構造

if

Squeak Smalltalk
if文はありませんが,ifに相当するメソッドが実装されています.

1 > 0 ifTrue:[  Transcript show:'Ha Ha Ha!!'; cr. ].
Objective-C

if(1 > 0){
  printf("Ha ha Ha!\n");
}

while

Squeak Smalltalk
i := 0.
[i<4] whileTrue:[ Transcript cr;show:'hoge'. i := i + 1. ].

Objective-C
int i = 0;
while(i<4){
  printf("hoge\n");
}

for

Squeak Smalltalk
for文のように振る舞うto:, to:do:, to:by:do:があります.


1 to: by:1 10 do:[:v | Transcript cr;show:v ].

Objective-C

int i;
for(i=1; i<11; i=i+1){
  printf("%d",i);
}
SmalltalkのイテレータとObjective-C高速列挙
別の時に説明します.

switch

Squeak Smalltalkにはありません.
余談,SmallTalk R4.1 http://smalltalk.smalltalk-users.jp/ ならあります.

Objective-C
略します.


次回は,クラス定義について書こうと思います.

[Objective-C] 基礎から学ぶ iPhoneアプリ開発

「Objective-C逆引きハンドブック」の著者である林 晃さんが,新しい本を出されました.

「基礎から学ぶ iPhoneアプリ開発」

昨日本屋で発見.思わず購入.

Core DataについてがAppleのDocumentより分かりやすいことと,具体的なサンプルがあって,良書です.



Objective-C逆引きハンドブックは,萩原さんの詳解Objective-C 2.0と一緒に持っておくとかなりいい.


Objective-Cのサンプルコードが,これほど多くまとめられているものは私の知っている限り数少ないと思う.
特に日本語で,非常に意味のあるサンプルコードばかりなので,Objective-Cをしっかりと使いたいひとにはお勧めだと思います.


2010年7月25日日曜日

[Squeak][VisualWorks] fold:

相変わらず,どうでもいいこと書きます.

http://lists.gforge.inria.fr/pipermail/pharo-project/2010-July/029669.html

fold:

foldと言われると,Squeakでは,inject:into:がすぐに思いつく.

#(1 2 3) inject:0 into:[:v1 v2 | v1 + v2 ].

Haskellでは
foldl (+) 0 [1, 2, 3]
Schemeでは
(fold + 0 '(1 2 3))

私のような初心者プログラマーは,初期値を考えるのが大変なので,ついつい,以下のようなコードを書いてしまいそうになってしまう.
array := Array with: 1 with: 2 with:3.
x := array first.
xs := array allButFirst.
xs inject:x into:[:v1 :v2 | v1 + v2 ].

このプログラムでは,allButFirstで,新たに配列を生成しているので,非効率.
やはり,きちんと初期値を決めなければなりません.

一方,Schemeでは,
gosh> (define array '(1 2 3))
gosh> (fold + (car array) (cdr array))
6

cdrは新たにリストを作成しているわけではないので,心配ありません.

それなら,初期値を考えていれればいいと言われる方もいると思いますが,これが意外と難しい.
例えば,配列の中から最大値を求めるのをinject:into:を書こうと思うと・・・.

array := Array with:-10 with:2 with:100.
array inject:  Float infinity negated into:[:v1 :v2 | v1 max: v2 ].
この場合は,マイナス無限大を初期値にする.


ちなみにVisualWorksでは,SequenceableCollection>>fold: が実装されている(さすが!).

array := Array with:1 with:2 with:3.
array fold:[:v1 :v2 | v1 + v2 ].

実装方法は,以下の通り.
SequenceableCollection>>fold: 
 | size nextValue |
 (size := self size) = 0 ifTrue: [^self emptyCollectionError].
  nextValue := self at: 1.
  2 to: size do:
  [:i | nextValue := binaryBlock value: nextValue value: (self at: i)].
  ^nextValue

先ほど,プログラムも簡単にかけます.

array := Array with:-10 with:2 with:100.
array fold:[:v1 :v2 | v1 max: v2 ].

ただし,SequenceableCollection>>fold: では,空のコレクションが与えられると,エラーになるので,注意が必要.エラーを発生させたくないなら,inject:into:を使うべき.
#() inject: 0 into:[:v1 :v2 | v1 + v2 ] "0が,かえってくる"

gosh> (fold +  0 '())
0

ふー,つかれた.

素人の意見としては,fold:が実装されるのは賛成.
みなさんはどう思われますか?



さらに,どうてもいいこと.

今回のでVisualWorksすごい!ってと思いましたが,Squeakユーザなので,操作がなかなか慣れない.

もともとHaskell,Schemeは,ほどんと書けなかったのですが,さらに書けなくなりましたorz

やっぱりReal Worldを購入すべきなのだろう.
英語本はもっているけど,読む時間がかかるので,やっぱり翻訳版を購入しようかな(でも高い・・・).
学生の頃に,翻訳本が出るとは思わなかったので,ついつい買ってしまった.

プログラミング言語の本を献本でもらえる人っていいなって思うけど,感想書くのが大変そう・・・.

2010年7月24日土曜日

日本語変換

高階関数を入力しようとおもったら,ことえりの変換では「後悔関数」.
がっかりだorz
ATOKはどうなんだろう.

iPhone, iPadもきちんと変換できなかった.

2010年7月22日木曜日

[Squeak] クイックソート その2

前回のクイックソートをSqueak 4.1以前のSqueakでも実行できるように変更してみました.

相変わらず,コストは無視しています.

quickSort := [:array  |
 | x xs left right |
 array isEmpty ifTrue:[ array ] ifFalse:[
 x := array first.
 xs := array allButFirst.
 left := xs select:[:v | v < x].
 right := xs select:[:v | v >= x].
  (quickSort  copy fixTemps value: left),(Array with:x), (quickSort copy fixTemps value:right )]].

quickSort copy fixTemps value: #(30 10 20 40 80 60) .


やっぱりSqueak 4.1がいい!