factor/library/inference/ties.factor

49 lines
1.4 KiB
Factor
Raw Normal View History

2005-02-23 21:50:51 -05:00
! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: inference
USING: kernel lists prettyprint ;
! A tie is when a literal value determines the type or value of
! a computed result. For example, in the following code, the
! type of the top of the stack depends on the outcome of the
! branch:
!
! dup cons? [ ... ] [ ... ] ifte
!
! In each branch, there is a different tie of the value to a
! type.
!
! Another type of tie happends with generic dispatch.
!
! The return value of the 'type' primitive determines the type
! of a value. The branch chosen in a dispatch determines the
! numeric value used as the dispatch parameter. Because of a
! pair of ties, this allows inferences such as the following
! having a stack effect of [ [ cons ] [ object ] ]:
!
! GENERIC: car
! M: cons car 0 slot ;
!
! The only branch that does not end with no-method pulls
2005-02-23 21:50:51 -05:00
! a tie that sets the value's type to cons after two steps.
! Formally, a tie is a tuple.
GENERIC: pull-tie ( tie -- )
TUPLE: class-tie value class ;
M: class-tie pull-tie ( tie -- )
dup class-tie-class swap class-tie-value
2dup set-value-class
value-class-ties assoc pull-tie ;
TUPLE: literal-tie value literal ;
M: literal-tie pull-tie ( tie -- )
dup literal-tie-literal swap literal-tie-value
2dup set-literal-value
value-literal-ties assoc pull-tie ;
M: f pull-tie ( tie -- )
#! For convenience.
drop ;