通用LISP函数用于计算数字和忽略字母

时间:2016-07-19 21:40:49

标签: common-lisp

我需要为学校写一个可以计算数字并忽略字母的函数。我是否需要为每次操作制作案例?我不知道如何开始。例如:

(+ 1 A 2 X) = (3 A X)
(- A 5 1 A) = 4
(* 2 C 0)   = 0 

所以我做了一部分问题。 DELNUM和DELSYM这两个函数用于分别从列表中删除数字。它现在都在工作,例如像( - A 5 A) - > 5不是,因为我需要一些条件。

(defun delnum (l)
  (remove-if-not #'symbolp l))

(delnum '(4 S 56 h ))
;;-> (S H)

(defun delsym (l)
  (remove-if-not #'numberp l))

(delsym '(+ a 1 2 3 b))
;;-> (1 2 3)

(defun test (l)
  (cond
    ((null l) nil)
    ((case (car l)
       (+ (cons (apply #'+ (delsym l)) (delnum (cdr l))))
       (- (cons (apply #'- (delsym l)) (delnum (cdr l))))
       (* (cond ((eql (apply #'* (delsym l)) 0) 0)
                ( t (cons (apply #'* (delsym l)) (delnum (cdr l))))))
       (/ (cond ((eql (car (delsym l)) 0)  '(error division by zero))
                ((eql (find 0 (delsym l)) 0) '(error division by zero))
                (t (cons (apply #'/ (delsym l)) (delnum (cdr l))))))))))

(test '(/ 0 ))           ;-> (ERROR DIVISION BY ZERO)
(test '(+ 1 2 A))        ;-> (3 A)
(test '(- 6 5 A C))      ;-> (1 AC)
(test '(- 1 5 A C X 0))  ;-> (-4 A C X)
(test '(* 0 5 A C))      ;-> 0
(test '(* 10 5 A C))     ;-> (50 A C)
(test '(/ 12 0 V 1 2))   ;-> (ERROR DIVISION BY ZERO)
(test '(/ S 3 7 C))      ;-> (3/7 S C)
(test '(+ -A A 5))       ;-> it gotta display 5 or (5)

0 个答案:

没有答案