factor/library/syntax/generic.factor

57 lines
1.6 KiB
Factor
Raw Normal View History

2005-02-18 20:37:01 -05:00
! Copyright (C) 2004, 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
! Bootstrapping trick; see doc/bootstrap.txt.
IN: !syntax
2005-08-22 14:29:43 -04:00
USING: generic kernel lists namespaces parser sequences syntax
words ;
2005-02-18 20:37:01 -05:00
: GENERIC:
2005-08-22 14:29:43 -04:00
#! GENERIC: bar == G: bar simple-combination ;
CREATE define-generic ; parsing
2005-02-18 20:37:01 -05:00
: G:
2005-08-22 14:29:43 -04:00
#! G: word combination ;
CREATE [ define-generic* ] [ ] ; parsing
2005-02-18 20:37:01 -05:00
2005-02-21 21:26:20 -05:00
: COMPLEMENT: ( -- )
2005-02-18 20:37:01 -05:00
#! Followed by a class name, then a complemented class.
CREATE
dup intern-symbol
scan-word define-complement ; parsing
: UNION: ( -- class predicate definition )
#! Followed by a class name, then a list of union members.
CREATE
dup intern-symbol
dup predicate-word
[ dupd unit "predicate" set-word-prop ] keep
2005-02-18 20:37:01 -05:00
[ define-union ] [ ] ; parsing
: PREDICATE: ( -- class predicate definition )
#! Followed by a superclass name, then a class name.
scan-word
CREATE dup intern-symbol
dup rot "superclass" set-word-prop
2005-02-18 20:37:01 -05:00
dup predicate-word
[ define-predicate-class ] [ ] ; parsing
2005-02-18 20:37:01 -05:00
: TUPLE:
#! Followed by a tuple name, then slot names, then ;
scan
string-mode on
[ string-mode off define-tuple ]
f ; parsing
: M: ( -- class generic [ ] )
#! M: foo bar begins a definition of the bar generic word
#! specialized to the foo type.
scan-word scan-word [ define-method ] [ ] ; parsing
: C:
#! Followed by a tuple name, then constructor code, then ;
#! Constructor code executes with the empty tuple on the
#! stack.
scan-word [ tuple-constructor ] keep
[ define-constructor ] [ ] ; parsing