From 64bbd248d50749c694c3a72fd750f0d62736476e Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Wed, 23 Nov 2011 01:43:02 -0800 Subject: [PATCH] classes.maybe: Change the type of maybe's class slot. As a result, maybe: maybe: integer is valid now, so fix the unit tests and its prettyprinting. --- basis/prettyprint/prettyprint-tests.factor | 6 ++++++ core/classes/maybe/maybe-tests.factor | 4 +++- core/classes/maybe/maybe.factor | 7 ++++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/basis/prettyprint/prettyprint-tests.factor b/basis/prettyprint/prettyprint-tests.factor index b3d78268d2..0a1adae8a0 100644 --- a/basis/prettyprint/prettyprint-tests.factor +++ b/basis/prettyprint/prettyprint-tests.factor @@ -449,3 +449,9 @@ TUPLE: fo { a intersection{ fixnum integer } initial: 0 } ; ] [ [ maybe: union{ float integer } . ] with-string-writer ] unit-test + +[ +"""maybe: maybe: integer\n""" +] [ + [ maybe: maybe: integer . ] with-string-writer +] unit-test diff --git a/core/classes/maybe/maybe-tests.factor b/core/classes/maybe/maybe-tests.factor index b11b5f14f5..5f536e906c 100644 --- a/core/classes/maybe/maybe-tests.factor +++ b/core/classes/maybe/maybe-tests.factor @@ -28,7 +28,9 @@ PREDICATE: natural < maybe: integer [ f ] [ 0 natural? ] unit-test [ t ] [ 1 natural? ] unit-test -[ "USE: math maybe: maybe: integer" eval( -- obj ) ] [ error>> bad-slot-value? ] must-fail-with +[ t ] [ f maybe: maybe: integer instance? ] unit-test +[ t ] [ 3 maybe: maybe: integer instance? ] unit-test +[ f ] [ 3.03 maybe: maybe: integer instance? ] unit-test INTERSECTION: only-f maybe: integer POSTPONE: f ; diff --git a/core/classes/maybe/maybe.factor b/core/classes/maybe/maybe.factor index f0b05f88ee..56c57343e1 100644 --- a/core/classes/maybe/maybe.factor +++ b/core/classes/maybe/maybe.factor @@ -5,7 +5,12 @@ classes.algebra.private classes.private classes.union.private effects kernel words ; IN: classes.maybe -TUPLE: maybe { class classoid initial: object read-only } ; +! The class slot has to be a union of a word and a classoid +! for TUPLE: foo { a maybe: foo } ; and maybe: union{ integer float } to work. +! In the first case, foo is not yet a tuple-class when maybe: is reached, +! thus it's not a classoid yet. union{ is a classoid, so the second case works. +! words are not generally classoids, so classoid alone is insufficient. +TUPLE: maybe { class union{ word classoid } initial: object read-only } ; C: maybe