現実逃避的に、Squeak のはてな用 pretty print を書いてみる。はてなでは、連続する ] の記号やタブをうまく表示できないので、ソースを日記に貼り付ける時には手で修正する必要があった。そこで、このソースを使うと、pretty print (右クリックのさらにメニューにある) を実行するだけではてな用に整形してくれる。インストール方法は、以下のソースを file in するだけ。ScamperWorkspace なら直接 file it in 出来ます。もちろんこのソース自体 pretty print されている。なんと自己記述的。
'From TeaSqueak3.6 of 8 February 2004 [latest update: #618] on 23 June 2004 at 7:37:01 pm'! !BlockNode methodsFor: 'printing' stamp: 'tak 6/23/2004 19:33'! printArgumentsOn: aStream indent: level arguments size = 0 ifTrue: [ statements size > 1 ifTrue: [aStream crtab: level] . ^ self] . aStream dialect = #SQ00 ifTrue: [ aStream withStyleFor: #setOrReturn do: [aStream nextPutAll: 'With'] . arguments do: [:arg | aStream space. aStream withStyleFor: #blockArgument do: [aStream nextPutAll: arg key] ] . aStream nextPutAll: '. '] ifFalse: [ arguments do: [:arg | aStream withStyleFor: #blockArgument do: [aStream nextPutAll: ':'; nextPutAll: arg key; space] ] . aStream nextPutAll: '| '] . "If >0 args and >1 statement, put all statements on separate lines" statements size > 1 ifTrue: [aStream crtab: level] ! ! !BlockNode methodsFor: 'printing' stamp: 'tak 6/23/2004 19:36'! printOn: aStream indent: level "statements size <= 1 ifFalse: [aStream crtab: level]." aStream nextPut: $[. self printArgumentsOn: aStream indent: level. self printTemporariesOn: aStream indent: level. self printStatementsOn: aStream indent: level. aStream nextPutAll: '] '! ! !MessageNode methodsFor: 'printing' stamp: 'tak 6/23/2004 19:34'! printKeywords: key arguments: args on: aStream indent: level prefix: isPrefix | keywords indent noColons arg kwd hasBrackets doCrTab | args size = 0 ifTrue: [ aStream space; nextPutAll: key. ^ self] . keywords _ key keywords. noColons _ aStream dialect = #SQ00 and: [keywords first endsWith: ':'] . doCrTab _ args size = 1 ifTrue: [false] ifFalse: [(args size = 2 and: [(args first isKindOf: BlockNode) not] ) ifTrue: [false] ifFalse: [true] ] . 1 to: (args size min: keywords size) do: [:i | arg _ args at: i. kwd _ keywords at: i. (doCrTab or: [arg isKindOf: BlockNode] ) ifTrue: [ aStream crtab: level + 1. indent _ 1 "newline after big args"] ifFalse: [ aStream space. indent _ 0] . noColons ifTrue: [ aStream withStyleFor: (isPrefix ifTrue: [#prefixKeyword] ifFalse: [#keyword] ) do: [aStream nextPutAll: kwd allButLast; space] . hasBrackets _ (arg isKindOf: BlockNode) or: [arg isKindOf: BlockNode] . hasBrackets ifFalse: [aStream nextPutAll: '('] ] ifFalse: [aStream nextPutAll: kwd; space] . arg printOn: aStream indent: level + 1 + indent precedence: (precedence = 2 ifTrue: [1] ifFalse: [precedence] ). noColons ifTrue: [hasBrackets ifFalse: [aStream nextPutAll: ')'] ] ] ! ! !WriteStream methodsFor: 'character writing' stamp: 'tak 6/23/2004 19:34'! crtab: anInteger self nextPut: Character cr. anInteger timesRepeat: [4 timesRepeat: [self nextPut: Character space] ] ! !