56 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Factor
		
	
	
! Copyright (c) 2008 Daniel Ehrenberg.
 | 
						|
! See http://factorcode.org/license.txt for BSD license.
 | 
						|
USING: words kernel sequences sequences.generalizations locals
 | 
						|
locals.parser fry locals.definitions accessors parser namespaces
 | 
						|
continuations summary definitions generalizations arrays
 | 
						|
prettyprint debugger io effects tools.annotations effects.parser ;
 | 
						|
IN: descriptive
 | 
						|
 | 
						|
ERROR: descriptive-error args underlying word ;
 | 
						|
 | 
						|
M: descriptive-error error.
 | 
						|
    "The word " write dup word>> pprint " encountered an error." print
 | 
						|
    "Arguments:" print
 | 
						|
    dup args>> stack.
 | 
						|
    "Error:" print
 | 
						|
    underlying>> error. ;
 | 
						|
 | 
						|
<PRIVATE
 | 
						|
 | 
						|
: rethrower ( word inputs -- quot )
 | 
						|
    [ length ] keep [ [ narray ] dip swap 2array flip ] 2curry
 | 
						|
    [ 2 ndip descriptive-error ] 2curry ;
 | 
						|
 | 
						|
: [descriptive] ( word def effect -- newdef )
 | 
						|
    swapd in>> rethrower [ recover ] 2curry ;
 | 
						|
 | 
						|
PRIVATE>
 | 
						|
 | 
						|
: make-descriptive ( word -- )
 | 
						|
    dup [ ] [ def>> ] [ stack-effect ] tri [descriptive]
 | 
						|
    '[ drop _ ] annotate ;
 | 
						|
 | 
						|
: define-descriptive ( word def effect -- )
 | 
						|
    [ drop "descriptive-definition" set-word-prop ]
 | 
						|
    [ [ [ dup ] 2dip [descriptive] ] keep define-declared ]
 | 
						|
    3bi ;
 | 
						|
 | 
						|
SYNTAX: DESCRIPTIVE: (:) define-descriptive ;
 | 
						|
 | 
						|
PREDICATE: descriptive < word
 | 
						|
    "descriptive-definition" word-prop >boolean ;
 | 
						|
 | 
						|
M: descriptive definer drop \ DESCRIPTIVE: \ ; ;
 | 
						|
 | 
						|
M: descriptive definition
 | 
						|
    "descriptive-definition" word-prop ;
 | 
						|
 | 
						|
SYNTAX: DESCRIPTIVE:: (::) define-descriptive ;
 | 
						|
 | 
						|
INTERSECTION: descriptive-lambda descriptive lambda-word ;
 | 
						|
 | 
						|
M: descriptive-lambda definer drop \ DESCRIPTIVE:: \ ; ;
 | 
						|
 | 
						|
M: descriptive-lambda definition
 | 
						|
    "lambda" word-prop body>> ;
 |