+rref button (oops), +factorial button
authorAlex Klinkhamer <grencez@gmail.com>
Mon, 21 Jul 2008 20:35:38 +0000 (21 16:35 -0400)
committerAlex Klinkhamer <grencez@gmail.com>
Mon, 21 Jul 2008 20:35:38 +0000 (21 16:35 -0400)
The functions nCr and nPr work, I just haven't decided how to integrate
them visually.

src/infix-parser.lisp
src/overload/client-fns.lisp
src/overload/numbers.lisp
src/webui/calcupage-buttons.lisp

index 414bb56..971dd61 100644 (file)
@@ -47,6 +47,7 @@
   +subtrn-rank+ 
   +multn-rank+
   +divisn-rank+
+  +factorial-rank+
   +exptn-rank+
   +vip-rank+);< Virtually infinite precedence.
 
            (setq
              *unwind-rank-fn* this-unwind-rank-fn
              *last-read* nil
-             tail (cdr (rplacd tail (cons val nil))))
+             tail (setf (cdr tail) (cons val nil)))
            (throw 'fn-scope (values)))
           ((< this-rank op-rank)
            (setq *unwind-rank-fn* this-unwind-rank-fn)
       *unwind-rank-fn* this-unwind-rank-fn)
     nil))
 
+;;; Parse an exclaimation point character.
+(defun factorial-reader (c strm)
+  (declare (ignore c strm)
+           (special *unwind-rank-fn* *last-read*))
+  (unless *last-read*
+    ;; Make sure any negatives are applied.
+    (funcall *unwind-rank-fn*
+             #'lineal.overload::over-factorial nil))
+  (setq *last-read*
+        (lineal.overload::factorial
+          (funcall *unwind-rank-fn*
+                   +factorial-rank+ *last-read*)))
+  nil)
+
+
 (defun open-paren-after-whitespace-peekp ()
   (declare (special *parse-strm* *parse-next*))
   (unless *parse-next*
     (set-opern-reader #\- +subtrn-rank+ #'subtrn)
     (set-opern-reader #\* +multn-rank+ #'multn)
     (set-opern-reader #\/ +divisn-rank+ #'divisn)
+    (set-macro-character #\! #'factorial-reader)
     (set-opern-reader #\^ +exptn-rank+ #'exptn))
 
 (defun process-infix-from-stream (strm)
index 9867e18..5d70d36 100644 (file)
@@ -13,6 +13,7 @@
         ("det" over-det)
         ("dot" over-dot-prod)
         ("expt" exptn)
+        ("factorial" over-factorial)
         ("inverse" over-multv-inverse)
         ("nAr" nAr) ("nCr" nCr) ("nPr" nPr)
         ("orth" over-orth)
index 7c39718..bd57112 100644 (file)
@@ -9,3 +9,7 @@
 (defmethod mult2n ((a number) (b number)) (* a b))
 (defmethod divis2n ((a number) (b number)) (/ a b))
 
+(defun over-factorial (n)
+  (declare (type (integer 0 *) n))
+  (factorial n))
+
index 69325df..85b9ecb 100644 (file)
@@ -1,3 +1,4 @@
+
 (in-package :lineal.webui)
 
 (defun htm-button
 (defun opern-button
   (name infixp &key (id "fn1") (input name))
   (htm-input-button
-     name id
-     (if infixp input
-       (concatenate
-         'string "(" input " "))))
+    name id
+    (if infixp input
+      (concatenate
+        'string "(" input " "))))
 
 (defun htm-fnbut
   (name id infix multi-param-p
         &optional (fntext name))
   (htm-input-button
-     name id
-     (if infix
-       (concatenate
-         'string fntext
-         (if multi-param-p "(" " "))
-       (concatenate
-         'string "(" fntext " "))))
+    name id
+    (if infix
+      (concatenate
+        'string fntext
+        (if multi-param-p "(" " "))
+      (concatenate
+        'string "(" fntext " "))))
 
 (defun htm-linalg-buttons (infix)
   (let
     ((linalg-fnlis
-       `("ref" "det"
+       `("rref" "ref" "det"
          nil "transpose" "inverse"
          nil ("dot") ("cross")
          ("proj") ("orth")
@@ -75,7 +76,7 @@
 
 (defun clear-button ()
   (htm-button "clear" "clear" "cleartext()"))
-  
+
 
 (defun ok-button ()
   (htm-button "ok" "ok" "sendCalc()"))
              strm)))))
     (concatenate
       'string
+      (if infixp
+        (opern-button "!" t)
+        (opern-button "!" nil :input "factorial"))
+      "<br />"
       (htm-fnbut "&radic;" "fn1" infixp nil "sqrt")
       (if infixp
         (opern-button "^" t)
         (opern-button "^" nil :input "expt"))
       (simple-input-button "(")
       (simple-input-button ")")
-      "<br/>" (htm-3digits 7)
+      "<br />" (htm-3digits 7)
       (opern-button "/" infixp)
-      "<br/>" (htm-3digits 4)
+      "<br />" (htm-3digits 4)
       (opern-button "&times;" infixp :input "*")
-      "<br/>" (htm-3digits 1)
+      "<br />" (htm-3digits 1)
       (opern-button "-" infixp)
-      "<br/>"
+      "<br />"
       (simple-input-button "0" "zerodigit")
       (simple-input-button "." "digit")
       (opern-button "+" infixp)
-      "<br/>"
+      "<br />"
       (memory-buttons infixp))))