(uiop:define-package :st-buchberger/src/polynomial-ring (:mix :cl) (:mix-reexport :st-buchberger/src/monomial-orderings) (:export #:polynomial-ring #:initialize-instance #:print-object #:*ring* #:with-polynomial-ring #:variables #:base-field)) (in-package #:st-buchberger/src/polynomial-ring) (defclass polynomial-ring (ring) ((variables :reader variables :initarg :variables :initform (error "You must specify at least one variable")) (base-field :reader base-field :initarg :base-field :initform 'rational))) (defmethod initialize-instance :after ((ring polynomial-ring) &key) (flet ((make-variables () (let ((vars (variables ring))) (if (consp vars) vars (list vars))))) (setf (slot-value ring 'variables) (make-variables)))) (defmethod print-object ((ring polynomial-ring) stream) (print-unreadable-object (ring stream :type t) (format stream "~@{~S ~S~^ ~}" :variables (variables ring) :base-field (base-field ring)))) (defvar *ring* (make-instance 'polynomial-ring :variables '(x y z)) "Default polynomial ring") (defmacro with-polynomial-ring (ring &body body) `(let ((*ring* ,ring)) ,@body))