2015-06-14 4 views
0

Я пытаюсь написать простую программу для перевода монет в Common Lisp. Это код, у меня естьНедопустимый специализированный параметр в методе лямбда-лист

(defun yn 
(let ht (random 1) 
    (if (eq ht 1) 
    (princ heads) 
    (princ tails)) 
) 
) 

Это кажется достаточно простым, но я получаю сообщение об ошибке:

"Invalid specialized parameter in method lambda list (LET HT (RANDOM 1) (IF (EQ HT 1) (PRINC HEADS) (PRINC TAILS))): (IF (EQ HT 1) (PRINC HEADS) (PRINC TAILS))" 
    ) 

Что может быть не так?

+0

Здесь вы можете скачать большую вводную книгу: https://www.cs.cmu.edu/~dst/LispBook/ –

ответ

4

Для defun без параметров, должен быть пустой список параметров, как следующее:

(defun yn() 
    (let ((ht (random 2))) 
    (if (eq ht 1) 
     (princ heads) 
     (princ tails)))) 
+3

Параметр 'let' синтаксис тоже неправильно, так что это не запускается, и он должен сигнализировать об ошибке при компиляции. – acelent

+0

@Paulo: Спасибо, я не заметил эту часть. Я также включил то, что было предложено @Vatine, то есть '(random 2)'. – ycsun

2

Ваш defun имеет неверный формат (отсутствует пустой список параметров). Вашего let имеет неверный формат (общая структура (let (<bind-spec>...) <body>), где связывание либо символ (первоначально связан с nil) или (<symbol> <value>) списка.

Оба heads и tails кажется несвязанным, это не ясно, если вы имеете в виду буквенные символы или используют переменные с динамической областью.

Ваш звонок random, вероятно, не делает то, что вы хотите, HyperSpec говорит: «Возвращает псевдослучайное число, которое является неотрицательным числом, меньшим, чем предел, и такой же тип, что и предел. ", поэтому (random 1) может возвращать только 0.

Ниже приведена очищенная версия, которая адресована всем этим точкам, если у вас есть буквальные символы heads и tails.

(defun yn() 
    (let ((ht (random 2))) 
    (if (eq ht 1) 
     (princ 'heads) 
     (princ 'tails))) 
+1

Синтаксис let в ответе по-прежнему не прав. Вы определяете переменную 'ht', инициализированную' nil', а переменную 'random' инициализировали с помощью 2. – acelent

+0

@PauloMadeira DOH! Спасибо, исправлено. – Vatine

Смежные вопросы