球拍输入辅助

时间:2016-02-06 23:10:45

标签: racket

我有一项在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)   参数:

1 个答案:

答案 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会导致更多问题。