Mercurial > emacs
diff lisp/calc/calc-incom.el @ 40785:2fb9d407ae73
Initial import of Calc 2.02f.
author | Eli Zaretskii <eliz@gnu.org> |
---|---|
date | Tue, 06 Nov 2001 18:59:06 +0000 |
parents | |
children | 73f364fd8aaa |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/calc/calc-incom.el Tue Nov 06 18:59:06 2001 +0000 @@ -0,0 +1,234 @@ +;; Calculator for GNU Emacs, part II [calc-incom.el] +;; Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. +;; Written by Dave Gillespie, daveg@synaptics.com. + +;; This file is part of GNU Emacs. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY. No author or distributor +;; accepts responsibility to anyone for the consequences of using it +;; or for whether it serves any particular purpose or works at all, +;; unless he says so in writing. Refer to the GNU Emacs General Public +;; License for full details. + +;; Everyone is granted permission to copy, modify and redistribute +;; GNU Emacs, but only under the conditions described in the +;; GNU Emacs General Public License. A copy of this license is +;; supposed to have been given to you along with GNU Emacs so you +;; can know your rights and responsibilities. It should be in a +;; file named COPYING. Among other things, the copyright notice +;; and this notice must be preserved on all copies. + + + +;; This file is autoloaded from calc-ext.el. +(require 'calc-ext) + +(require 'calc-macs) + +(defun calc-Need-calc-incom () nil) + + +;;; Incomplete forms. + +(defun calc-begin-complex () + (interactive) + (calc-wrapper + (if (or calc-algebraic-mode calc-incomplete-algebraic-mode) + (calc-alg-entry "(") + (calc-push (list 'incomplete calc-complex-mode)))) +) + +(defun calc-end-complex () + (interactive) + (calc-comma t) + (calc-wrapper + (let ((top (calc-top 1))) + (if (and (eq (car-safe top) 'incomplete) + (eq (nth 1 top) 'intv)) + (progn + (if (< (length top) 4) + (setq top (append top '((neg (var inf var-inf)))))) + (if (< (length top) 5) + (setq top (append top '((var inf var-inf))))) + (calc-enter-result 1 "..)" (cdr top))) + (if (not (and (eq (car-safe top) 'incomplete) + (memq (nth 1 top) '(cplx polar)))) + (error "Not entering a complex number")) + (while (< (length top) 4) + (setq top (append top '(0)))) + (if (not (and (math-realp (nth 2 top)) + (math-anglep (nth 3 top)))) + (error "Components must be real")) + (calc-enter-result 1 "()" (cdr top))))) +) + +(defun calc-begin-vector () + (interactive) + (calc-wrapper + (if (or calc-algebraic-mode calc-incomplete-algebraic-mode) + (calc-alg-entry "[") + (calc-push '(incomplete vec)))) +) + +(defun calc-end-vector () + (interactive) + (calc-comma t) + (calc-wrapper + (let ((top (calc-top 1))) + (if (and (eq (car-safe top) 'incomplete) + (eq (nth 1 top) 'intv)) + (progn + (if (< (length top) 4) + (setq top (append top '((neg (var inf var-inf)))))) + (if (< (length top) 5) + (setq top (append top '((var inf var-inf))))) + (setcar (cdr (cdr top)) (1+ (nth 2 top))) + (calc-enter-result 1 "..]" (cdr top))) + (if (not (and (eq (car-safe top) 'incomplete) + (eq (nth 1 top) 'vec))) + (error "Not entering a vector")) + (calc-pop-push-record 1 "[]" (cdr top))))) +) + +(defun calc-comma (&optional allow-polar) + (interactive) + (calc-wrapper + (let ((num (calc-find-first-incomplete + (nthcdr calc-stack-top calc-stack) 1))) + (if (= num 0) + (error "Not entering a vector or complex number")) + (let* ((inc (calc-top num)) + (stuff (calc-top-list (1- num))) + (new (append inc stuff))) + (if (and (null stuff) + (not allow-polar) + (or (eq (nth 1 inc) 'vec) + (< (length new) 4))) + (setq new (append new + (if (= (length new) 2) + '(0) + (nthcdr (1- (length new)) new))))) + (or allow-polar + (if (eq (nth 1 new) 'polar) + (setq new (append '(incomplete cplx) (cdr (cdr new)))) + (if (eq (nth 1 new) 'intv) + (setq new (append '(incomplete cplx) + (cdr (cdr (cdr new)))))))) + (if (and (memq (nth 1 new) '(cplx polar)) + (> (length new) 4)) + (error "Too many components in complex number")) + (if (and (eq (nth 1 new) 'intv) + (> (length new) 5)) + (error "Too many components in interval form")) + (calc-pop-push num new)))) +) + +(defun calc-semi () + (interactive) + (calc-wrapper + (let ((num (calc-find-first-incomplete + (nthcdr calc-stack-top calc-stack) 1))) + (if (= num 0) + (error "Not entering a vector or complex number")) + (let ((inc (calc-top num)) + (stuff (calc-top-list (1- num)))) + (if (eq (nth 1 inc) 'cplx) + (setq inc (append '(incomplete polar) (cdr (cdr inc)))) + (if (eq (nth 1 inc) 'intv) + (setq inc (append '(incomplete polar) (cdr (cdr (cdr inc))))))) + (cond ((eq (nth 1 inc) 'polar) + (let ((new (append inc stuff))) + (if (> (length new) 4) + (error "Too many components in complex number") + (if (= (length new) 2) + (setq new (append new '(1))))) + (calc-pop-push num new))) + ((null stuff) + (if (> (length inc) 2) + (if (math-vectorp (nth 2 inc)) + (calc-comma) + (calc-pop-push 1 + (list 'incomplete 'vec (cdr (cdr inc))) + (list 'incomplete 'vec))))) + ((math-vectorp (car stuff)) + (calc-comma)) + ((eq (car-safe (car-safe (nth (+ num calc-stack-top) + calc-stack))) 'incomplete) + (calc-end-vector) + (calc-comma) + (let ((calc-algebraic-mode nil) + (calc-incomplete-algebraic-mode nil)) + (calc-begin-vector))) + ((or (= (length inc) 2) + (math-vectorp (nth 2 inc))) + (calc-pop-push num + (append inc (list (cons 'vec stuff))) + (list 'incomplete 'vec))) + (t + (calc-pop-push num + (list 'incomplete 'vec + (cons 'vec (append (cdr (cdr inc)) stuff))) + (list 'incomplete 'vec))))))) +) + +(defun calc-digit-dots () + (if (eq calc-prev-char ?.) + (progn + (delete-backward-char 1) + (if (calc-minibuffer-contains ".*\\.\\'") + (delete-backward-char 1)) + (setq calc-prev-char 'dots + last-command-char 32) + (if calc-prev-prev-char + (calcDigit-nondigit) + (setq calc-digit-value nil) + (erase-buffer) + (exit-minibuffer))) + ;; just ignore extra decimal point, anticipating ".." + (delete-backward-char 1)) +) + +(defun calc-dots () + (interactive) + (calc-wrapper + (let ((num (calc-find-first-incomplete + (nthcdr calc-stack-top calc-stack) 1))) + (if (= num 0) + (error "Not entering an interval form")) + (let* ((inc (calc-top num)) + (stuff (calc-top-list (1- num))) + (new (append inc stuff))) + (if (not (eq (nth 1 new) 'intv)) + (setq new (append '(incomplete intv) + (if (eq (nth 1 new) 'vec) '(2) '(0)) + (cdr (cdr new))))) + (if (and (null stuff) + (= (length new) 3)) + (setq new (append new '((neg (var inf var-inf)))))) + (if (> (length new) 5) + (error "Too many components in interval form")) + (calc-pop-push num new)))) +) + +(defun calc-find-first-incomplete (stack n) + (cond ((null stack) + 0) + ((eq (car-safe (car-safe (car stack))) 'incomplete) + n) + (t + (calc-find-first-incomplete (cdr stack) (1+ n)))) +) + +(defun calc-incomplete-error (a) + (cond ((memq (nth 1 a) '(cplx polar)) + (error "Complex number is incomplete")) + ((eq (nth 1 a) 'vec) + (error "Vector is incomplete")) + ((eq (nth 1 a) 'intv) + (error "Interval form is incomplete")) + (t (error "Object is incomplete"))) +) + + +