2015-11-21 6 views
0

У меня есть эта функция, которая преобразует число в определенную базу. Я хочу сообщить об ошибке, если база, которую я вводил, больше 9 и меньше 2, но я не знаю. Не могли бы вы мне помочь?Сообщить об ошибке в LISP

(defun zecb (number base) 
    (write-to-string number :base base)) 
+0

Пожалуйста, дайте нам код, у вас уже есть/пробовал. – Berendschot

ответ

2

Что вы подразумеваете под «сообщением об ошибке»? Если вы имеете в виду что-то вроде метания исключения в других языках, error может Sute ваших потребностей:

(error "Base must be between 2 and 9") 

Подробнее о common lisp conditions and handlers, если вам нужно что-то более, чем просто sufisticated ошибок.

0

Если вы хотите напечатать ошибку, вы можете использовать одну из доступных функций записи/печати (см. Output to character streams).

Пример:

(defun zecb (nb base) 
    "Test" 
    (if (or (< nb 2) (> nb 9)) 
     (princ "Number Not in range") 
     (* nb base))) 
+0

Большинство общих операций отношения lisp'site, например < and >, могут принимать более двух аргументов. Вы можете избежать «или» и просто сказать «(не (<= 2 nb 9))», который больше похож на математическую нотацию. –

+0

Спасибо. Однако в математике операторы не и <= являются унарными и двоичными, соответственно. Что именно означает (<= a b c)? a <= b <= c? – MASL

+1

Да. <= является двоичным, но поскольку он также является транзитивным, запись (<= a b c d ...) вместо (и (<= a b) (<= b c) ...) хороша, и легче видеть диапазон. Например, когда мы будем писать 0 <= i <= n, приятно писать (<= 0 i n), так как слева направо соответствуют возрастающему порядку. Даже в языках с двоичным <=, приятно писать (0 <= i) && (i <= n). Постоянное соблюдение порядка помогает читателям. –

4

Исходя из состояния системы, CoreDump уже упоминалось, есть также assert macro, который является частью Common Lisp. Попробуйте следующее в вашем РЕПЛ:

(defun divide (num denom) 
    (assert (not (= 0 denom)) 
      (denom) 
      "Attempted to divide ~a by zero, use a different denominator!" num) 
    (/ num denom)) 

(divide 42 0) 

(Non-interactive example)

5
CL-USER 99 > (defun test (n) 
       (check-type n (integer 2 9)) 
       n) 
TEST 

CL-USER 100 > (test 2) 
2 

CL-USER 101 > (test 9) 
9 

CL-USER 102 > (test 10) 

Error: The value 10 of N is not of type (INTEGER 2 9). 
Смежные вопросы