2016-02-06 2 views
-2

У меня есть задание создать калькулятор в Racket. Пользователь вызывает калькулятор, получает приглашение, вводит два значения, составляющих имя процедуры, а третье - это значение, переданное процедуре. Он принимает ввод, но затем выдает ошибку. Мое намерение состоит в том, чтобы вычислить call tom и передать ему список, полученный из ui. inchestofeet - это просто местозаполнитель, который в настоящее время возвращает то же самое значение, которое оно передало.Помощь по вводу ракеты

  (define(getInput prompt-string)(begin(display prompt-string)(read))) 

     (define(inchestofeet x)(x)) 

     (define(ui)((list(getInput "1st part:")(getInput "2nd part:")) (getInput "value"))) 


     (define(tom input-list) 
      ((eval(list(string->symbol(string-append(symbol->string(car input-list)(symbol->string(car(cdr input-list))))))(caddr input-list))))) 

     (define(calculator)(tom(ui))) 

Ошибка:

применение: не процедура; ожидается процедуру, которая может быть применена к аргументам дал: (дюймы) tofeet аргументы .:

ответ

1

Есть много проблем с этим, но вот почему вы получите эту ошибку.

Когда вы вводите скобки в ракетке, они обычно означают, что это вызов функции формы (some-function argument ...). Поскольку это вызов функции, вещь после открытого парана должна быть функцией. В вашем определении ui, у вас есть

((list (getInput "1st part:") ...) ...) 

Проблема заключается в том, что (list (getInput "1st part:") ...) не является функцией, а список. В сообщении об ошибке указано application: not a procedure; expected a procedure that can be applied to arguments, потому что это приложение-функция, поэтому ожидается функция. Он говорит given: '(inches tofeet), потому что вместо этого вы дали ему список.

Другая проблема, которую я вижу, заключается в том, что вы говорите, что inchestofeet является заполнителем, который должен возвращать то же самое значение, которое он передал. Для этого вы должны сделать (define (inchestofeet x) x), потому что (x) будет рассматриваться как вызов функции, а x не является функцией, поэтому вы получите ту же ошибку.

Кроме того, я бы рекомендовал вам не использовать eval. Вы должны найти другой способ поддержки операций, которые вы хотите. Использование eval приведет к большему количеству проблем.

+0

Есть ли у вас какие-либо предложения о том, как запрашивать пользователя для строки и преобразовывать этот вход в вызов процедуры? В нашем классе нам давали eval для использования, и я не нашел другого эффективного способа сделать это. – Tom

+0

Ну, чтобы запросить пользователя для строки, вы, вероятно, захотите использовать ['read-line'] (https://docs.racket-lang.org/reference/Byte_and_String_Input.html#%28def._%28%28quote ._ ~ 23 ~ 25kernel% 29._read-line% 29% 29) следующим образом: '(define input (read-line))'. Если вы хотите вызвать пользователя перед его вызовом, вы должны определить вспомогательную функцию, например 'get-input', которая выполняет' (begin (display prompt-string) (read-line)) ', а затем использовать' (define input (get-input prompt-string)). –

+0

Что касается преобразования этого ввода в вызов процедуры, то я бы написал запись, которая указывает, какие строки означают что, а затем использовать 'cond' (или' case', 'match' или какую-либо другую ветвящуюся форму) для делать разные вещи, основываясь на какой строке. –

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