;;; -*- mode: lisp; syntax: common-lisp; package: existenz-client; coding: utf-8-unix; -*- (in-package #:existenz-common) ;;; shorthand for interactive degree values, also coerces to ;;; CL-TUPLES::FAST-FLOAT (defun to-radian (degree) (* degree #.(coerce (/ pi 180) 'cl-tuples::fast-float))) ;; FIXME: this fails omniusly while reading NIL #+(or) (defun |#°-reader| (stream sub-char arg) (declare (ignore sub-char arg)) (let ((read (read stream T NIL T))) (and read (to-radian read)))) ;; (set-dispatch-macro-character #\# #\° #'|#°-reader|) (defun matrix-elements (dimensions &optional (prefix '#:e)) (labels ((aux (dimensions) (let ((car (car dimensions)) (cdr (cdr dimensions))) (if cdr (iterate outer (for i from 0 below car) (iterate (for x in (aux cdr)) (in outer (collect (list* i x))))) (iterate (for i from 0 below car) (collect (list i))))))) (map 'list (lambda (list) (find-symbol (format NIL "~A~{~A~}" prefix list))) (aux dimensions)))) (defun matrix2-elements (dimension &optional (prefix '#:e)) (matrix-elements (list dimension dimension) prefix))