Let's write β

プログラミング中にできたことか、思ったこととか

SqueakでBrainFuckを書いてみた。

10分ぐらいで書いてみました。
といってもほとんどの言語仕様をカバーしたかな?といった物です。

Object subclass: #BrainFuck
	instanceVariableNames: 'memory sp braceStack'
	classVariableNames: ''
	poolDictionaries: ''
	category: 'BrainFuck'

"BrainFuck >> initialize"
initialize
	super initialize.
	sp := 1.
	braceStack := OrderedCollection new.
	memory := OrderedCollection new: 300 withAll: 0.

"BrainFuck >> eval: aString"
eval: aString
	| idx length stringAsArray|
	idx := 1.
	stringAsArray := aString asArray.
	length := stringAsArray size.
	[ idx > length ] whileFalse: [
		|char|
		char := stringAsArray at: idx.
		char caseOf: {
			[$+] -> [memory at: sp put: ((memory at: sp) + 1). idx := idx + 1.].
			[$-]  -> [memory at: sp put: ((memory at: sp) -  1). idx := idx + 1.].
			[$>] -> [sp := sp + 1. idx := idx + 1].
			[$<] -> [sp := sp -  1. idx := idx + 1].
			[$[]  -> [((memory at: sp) = 0) ifTrue: [
						| found |
						found := false.
						[idx > length or: found] whileFalse: [
							| cchar|
							cchar := stringAsArray at: idx.
							(cchar = $]) ifTrue: [found := true] ifFalse: [idx := idx + 1].
						].
					] ifFalse: [braceStack addFirst: idx. idx := idx + 1]].
			[$]]  -> [((memory at: sp) = 0) ifTrue: [idx := idx + 1] ifFalse: [idx := braceStack removeFirst]].
			[$.]  -> [Transcript show: (Character value: (memory at: sp)). idx := idx + 1].
		} otherwise: [idx := idx + 1].
	].

こんなところでしょうか、時々なぜかスタックポインタが0になってしまいエラーが発生しますが、とりあえずHe11o,worldや素数判定は動作しています。