git.fiddlerwoaroof.com
top/tuple.scm
4e987026
 ;;; This file creates type definitions for tuples of arbitrary size.
 
 (define *tuple-definitions* '())
 
 (define (init-tuples)
   (setf *tuple-definitions* '()))
 
 (define (tuple-tycon k)
   (let ((tycon (assq k *tuple-definitions*)))
     (if (eq? tycon '#f)
 	(new-tuple-tycon k)
 	(tuple-2-2 tycon))))
 
 (define (tuple-constructor k)
   (car (algdata-constrs (tuple-tycon k))))
 
 (define (is-tuple-constructor? x)
   (and (con? x) (is-tuple-tycon? (con-alg x))))
 
 (define (is-tuple-tycon? x)
   (and (algdata? x) (algdata-real-tuple? x)))
 
 (define (tuple-constructor-arity x)
   (con-arity x))
 
 (predefine (ast->gtype c t))          ; in util/type-utils.scm
 (predefine (**arrow-type/l args))     ; in util/constructors.scm
 (predefine (**tyvar x))               ; in util/constructors.scm
 
 (define (new-tuple-tycon k)
   (cond ((eqv? k 0)
 	 (core-symbol "UnitType"))
 	(else
 	 (let* ((name (string->symbol (format '#f "Tuple~A" k)))
 		(cname (string->symbol (format '#f ";MkTuple~A" k)))
 		(dummy-vars (gen-dummy-names k))
 		(algdata (make algdata
 			       (name name)
 			       (module '*core*)
 			       (unit '*core*)
 			       (exported? '#t)
 			       (arity k)
 			       (n-constr 1)
 			       (context '())
 			       (tyvars dummy-vars)
 			       (classes '())  ;; filled in later
 			       (enum? '#f)
 			       (tuple? '#t)
 			       (real-tuple? '#t)
 			       (deriving '())))
 		(constr (make con
 			      (name cname)
 			      (module '*core*)
 			      (unit '*core*)
 			      (exported? '#t)
 			      (arity k)
 			      (types (map (function **tyvar) dummy-vars))
 			      (tag 0)
 			      (alg algdata)
 			      (slot-strict? '())
 			      (infix? '#f)))
 		(tyvars (map (function **tyvar) dummy-vars))
 		(tuple-type (**tycon/def algdata tyvars)))
 	   (dotimes (i k)
 	      (push '#f (con-slot-strict? constr)))
 	   (setf (algdata-signature algdata)
 		 (ast->gtype '() tuple-type))
 	   (setf (con-signature constr)
 		 (ast->gtype '() (**arrow-type/l
 				  (append tyvars (list tuple-type)))))
 	   (setf (algdata-constrs algdata)
 		 (list constr))
 	   (push (tuple k algdata) *tuple-definitions*)
 	   algdata))))
 
 (define (gen-dummy-names n)
   (gen-dummy-names-1 n '()))
 
 (define (gen-dummy-names-1 n l)
   (if (eqv? n 0)
       l
       (gen-dummy-names-1 (1- n)
 			 (cons (string->symbol (format '#f "a~A" n)) l))))