我有一项在Racket中创建计算器的任务。用户调用计算器,获取提示,输入构成过程名称的两个值,第三个是传递给过程的值。它接受输入但然后抛出错误。我的目的是让计算器调用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) 参数:
答案 0 :(得分:1)
这有很多问题,但这就是你得到这个错误的原因。
当你在球拍中输入括号时,它们通常意味着它是(some-function argument ...)
形式的函数调用。因为它是一个函数调用,所以在open-paren之后的东西需要是一个函数。在您对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
会导致更多问题。