The cross operator results in the cartesian product of two or more sets. This is the basic method for defining compound data types in Sol. The cross operator also allows fields to be named, and has a special syntax for defining fields which are sets of one member (constants) and static fields which are available through the set itself and are shared by all instances created through the constructor.
(define cross
(function
sset set-list
(letrec
((check-args
(lambda (arguments)
(if (null? arguments)
#t
(if (set? (car arguments))
(check-args (cdr arguments))
#f)))))
(if (check-args set-list)
(cons 'cross set-list)
(error "Bad arguments to cross (must be list of sets): " set-list)))))