歪 で die さんが書いておられる PostScript(GhostScript)版を直訳気味に(一部、意訳ありw)。
| グラフ | グラフ := [:入力文字列 | | 列数 行 現在行 変換テーブル 空白行 行移動 現在列 記号 情報 | 列数 := 入力文字列 size. 行 := OrderedCollection new. 現在行 := 1. 変換テーブル := Dictionary new. 変換テーブル at: $R put: {-1. $/. 0}. 変換テーブル at: $F put: {0. $\. 1}. 変換テーブル at: $C put: {0. $_. 0}. 空白行 := String new: 列数 withAll: Character space. 行移動 := [:差分 | 現在行 + 差分 = 0 ifTrue: [行 addFirst: 空白行 copy] ifFalse: [(現在行 := 現在行 + 差分) = (行 size + 1) ifTrue: [行 addLast: 空白行 copy]]]. (1 to: 列数) do: [:nn | 現在列 := nn. 記号 := 入力文字列 at: 現在列. 情報 := 変換テーブル at: 記号. 行移動 value: 情報 last. (行 at: 現在行) at: 現在列 put: 情報 middle. 行移動 value: 情報 first]. 行 do: [:各行 | Transcript cr; show: 各行]]. World findATranscript: nil. グラフ value: 'RCRFCRFFCCRFFRRCRRCCFRFRFF'
同じ内容を、ほんの気持ちシンプルにした版
| series lines newLine xx move | series := 'RCRFCRFFCCRFFRRCRRCCFRFRFF'. newLine := String new: series size withAll: Character space. lines := OrderedCollection new. xx := 1. move := [:delta | xx + delta = 0 ifTrue: [lines addFirst: newLine copy] ifFalse: [ xx := xx + delta. xx > lines size ifTrue: [lines addLast: newLine copy]]]. series doWithIndex: [:each :yy | each caseOf: { [$R] -> [move value: 0. (lines at: xx) at: yy put: $/. move value: -1]. [$F] -> [move value: 1. (lines at: xx) at: yy put: $\. move value: 0]. [$C] -> [move value: 0. (lines at: xx) at: yy put: $_. move value: 0]}]. World findATranscript: nil. lines do: [:line | Transcript cr; show: line]