У меня есть задание создать калькулятор в 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 аргументы .:
Есть ли у вас какие-либо предложения о том, как запрашивать пользователя для строки и преобразовывать этот вход в вызов процедуры? В нашем классе нам давали eval для использования, и я не нашел другого эффективного способа сделать это. – Tom
Ну, чтобы запросить пользователя для строки, вы, вероятно, захотите использовать ['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)). –
Что касается преобразования этого ввода в вызов процедуры, то я бы написал запись, которая указывает, какие строки означают что, а затем использовать 'cond' (или' case', 'match' или какую-либо другую ветвящуюся форму) для делать разные вещи, основываясь на какой строке. –