git.fiddlerwoaroof.com
top/core-symbols.scm
4e987026
 ;;; This defines all core symbols.
 
 ;;; Core symbols are stored in global variables.  The core-symbol
 ;;; macro just turns a string into a variable name.
 
 (define-syntax (core-symbol str)
   (make-core-symbol-name str))
 
 (define (make-core-symbol-name str)
   (string->symbol (string-append "*core-" str "*")))
 
 (define (symbol->core-var name)
   (make-core-symbol-name (symbol->string name)))
 
 (define (get-core-var-names vars type)
   (let ((res (assq type vars)))
     (if (eq? res '#f)
 	'()
 	(map (function string->symbol) (tuple-2-2 res)))))
 
 ;;; This is just used to create a define for each var without a
 ;;; value.
 
 (define-syntax (define-core-variables)
   `(begin
      ,@(define-core-variables-1 *haskell-prelude-vars*)
      ,@(define-core-variables-1 *haskell-noncore-vars*)))
 
 (define (define-core-variables-1 vars)
   (concat (map (lambda (ty)
 		 (map (function init-core-symbol)
 		      (get-core-var-names vars ty)))
 	       '(classes methods types constructors synonyms values))))
 
 (define (init-core-symbol sym)
   `(define ,(symbol->core-var sym) '()))
 
 (define-syntax (create-core-globals)
   `(begin
      (begin ,@(create-core-defs *haskell-prelude-vars* '#t))
      (begin ,@(create-core-defs *haskell-noncore-vars* '#f))))
 
 (define (create-core-defs defs prelude-core?)
   `(,@(map (lambda (x) (define-core-value x prelude-core?))
 	   (get-core-var-names defs 'values))
      ,@(map (lambda (x) (define-core-method x prelude-core?))
 	   (get-core-var-names defs 'methods))
      ,@(map (lambda (x) (define-core-synonym x prelude-core?))
 	   (get-core-var-names defs 'synonyms))
      ,@(map (lambda (x) (define-core-class x prelude-core?))
 	   (get-core-var-names defs 'classes))
      ,@(map (lambda (x) (define-core-type x prelude-core?))
 	    (get-core-var-names defs 'types))
      ,@(map (lambda (x) (define-core-constr x prelude-core?))
 	    (get-core-var-names defs 'constructors))))
 
 
 (define (define-core-value name pc?)
     `(setf ,(symbol->core-var name)
 	   (make-core-value-definition ',name ',pc?)))
 
 (define (make-core-value-definition name pc?)
   (install-core-sym
     (make var (name name) (module '|*Core|) (unit '|*Core|))
     name
     pc?))
 
 (define (define-core-method name pc?)
     `(setf ,(symbol->core-var name)
 	   (make-core-method-definition ',name ',pc?)))
 
 (define (make-core-method-definition name pc?)
   (install-core-sym
     (make method-var (name name) (module '|*Core|) (unit '|*Core|))
     name
     pc?))
 
 (define (define-core-class name pc?)
     `(setf ,(symbol->core-var name)
 	   (make-core-class-definition ',name ',pc?)))
 
 (define (make-core-class-definition name pc?)
   (install-core-sym
     (make class (name name) (module '|*Core|) (unit '|*Core|))
     name
     pc?))
 
 (define (define-core-synonym name pc?)
     `(setf ,(symbol->core-var name)
 	   (make-core-synonym-definition ',name ',pc?)))
 
 (define (make-core-synonym-definition name pc?)
   (install-core-sym
     (make synonym (name name) (module '|*Core|) (unit '|*Core|))
     name
     pc?))
 
 (define (define-core-type name pc?)
     `(setf ,(symbol->core-var name)
 	   (make-core-type-definition ',name ',pc?)))
 
 (define (make-core-type-definition name pc?)
   (install-core-sym
     (make algdata (name name) (module '|*Core|) (unit '|*Core|))
     name
     pc?))
 
 (define (define-core-constr name pc?)
     `(setf ,(symbol->core-var name)
 	   (make-core-constr-definition ',name ',pc?)))
 
 (define (make-core-constr-definition name pc?)
   (setf name (add-con-prefix/symbol name))
   (install-core-sym
     (make con (name name) (module '|*Core|) (unit '|*Core|))
     name
     pc?))
 
 (define (install-core-sym def name preludecore?)
   (setf (def-core? def) '#t)
   (when preludecore? 
     (setf (def-prelude? def) '#t))
   (setf (table-entry (dynamic *core-symbols*) name) def)
   (when preludecore?
     (setf (table-entry (dynamic *prelude-core-symbols*) name) def))
   def)