! ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
IN: unparser
+USE: generic
USE: kernel
USE: format
USE: lists
USE: strings
USE: words
+GENERIC: unparse ( obj -- str )
+
+M: object unparse ( obj -- str )
+ [
+ "#<" ,
+ dup type type-name ,
+ " @ " ,
+ address unparse ,
+ ">" ,
+ ] make-string ;
+
: >digit ( n -- ch )
dup 10 < [ CHAR: 0 + ] [ 10 - CHAR: a + ] ifte ;
: >oct ( num -- string ) 8 >base ;
: >hex ( num -- string ) 16 >base ;
-DEFER: unparse
+M: fixnum unparse ( obj -- str ) >dec ;
+M: bignum unparse ( obj -- str ) >dec ;
-: unparse-ratio ( num -- str )
+M: ratio unparse ( num -- str )
[
dup
numerator unparse ,
denominator unparse ,
] make-string ;
-: unparse-complex ( num -- str )
+: fix-float ( str -- str )
+ #! This is terrible. Will go away when we do our own float
+ #! output.
+ "." over str-contains? [ ".0" cat2 ] unless ;
+
+M: float unparse ( float -- str )
+ (unparse-float) fix-float ;
+
+M: complex unparse ( num -- str )
[
"#{ " ,
dup
] ifte
] unless ;
-: unparse-str ( str -- str )
+M: string unparse ( str -- str )
[
CHAR: " , [ unparse-ch , ] str-each CHAR: " ,
] make-string ;
-: unparse-word ( word -- str )
+M: word unparse ( obj -- str )
word-name dup "#<unnamed>" ? ;
-: fix-float ( str -- str )
- #! This is terrible. Will go away when we do our own float
- #! output.
- "." over str-contains? [ ".0" cat2 ] unless ;
-
-: unparse-float ( float -- str ) (unparse-float) fix-float ;
-
-: unparse-unknown ( obj -- str )
- [
- "#<" ,
- dup type type-name ,
- " @ " ,
- address unparse ,
- ">" ,
- ] make-string ;
-
-: unparse-t drop "t" ;
-: unparse-f drop "f" ;
-
-: unparse ( obj -- str )
- {
- [ >dec ]
- [ unparse-word ]
- [ unparse-unknown ]
- [ unparse-unknown ]
- [ unparse-ratio ]
- [ unparse-complex ]
- [ unparse-f ]
- [ unparse-t ]
- [ unparse-unknown ]
- [ >dec ]
- [ unparse-float ]
- [ unparse-unknown ]
- [ unparse-str ]
- [ unparse-unknown ]
- [ unparse-unknown ]
- [ unparse-unknown ]
- [ unparse-unknown ]
- } generic ;
+M: t unparse drop "t" ;
+M: f unparse drop "f" ;
[ "Hello world" ] [ 4 foobar foobar ] unit-test
[ "Goodbye cruel world" ] [ 4 foobar ] unit-test
+
+GENERIC: bool>str
+M: t bool>str drop "true" ;
+M: f bool>str drop "false" ;
+
+: str>bool
+ [
+ [ "true" | t ]
+ [ "false" | f ]
+ ] assoc ;
+
+[ t ] [ t bool>str str>bool ] unit-test
+[ f ] [ f bool>str str>bool ] unit-test
USE: parser
USE: test
USE: unparser
+USE: kernel
+USE: io-internals
[ "\"hello\\\\backslash\"" ]
[ "hello\\backslash" ]
[ "car" ] [ \ car unparse ] unit-test
[ "#{ 1/2 2/3 }" ] [ #{ 1/2 2/3 } unparse ] unit-test
[ "1267650600228229401496703205376" ] [ 1 100 shift unparse ] unit-test
+
+[ ] [ { 1 2 3 } unparse drop ] unit-test
+[ stdin unparse parse ] unit-test-fails
IN: lists BUILTIN: cons 2
IN: math BUILTIN: ratio 4
IN: math BUILTIN: complex 5
+IN: syntax BUILTIN: f 6 FORGET: f?
+IN: syntax BUILTIN: t 7 FORGET: t?
IN: math BUILTIN: bignum 9
IN: math BUILTIN: float 10
IN: vectors BUILTIN: vector 11