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や素数判定は動作しています。