2016-02-06 47 views
-2

我有一个任务在球拍中创建一个计算器。用户调用计算器,获得提示,输入构成过程名称的两个值,第三个值是传递给过程的值。它接受输入,然后它会抛出一个错误。我的意图是让计算器调用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

对于如何提示用户输入字符串并将该输入转换为过程调用,您有任何建议吗?在我们班,我们被评估为使用,而且我还没有找到任何其他有效的方法。 – 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))'。如果你想在调用它之前提示用户,那么你可以定义一个helper函数,比如'get-input',它可以执行'(begin(display prompt-string)(read-line))',然后使用'(define input (get-input prompt-string))'。 –

+0

至于将输入转换为过程调用,我会做的是写一个注释记录哪些字符串意味着什么,然后使用'cond'(或'case','match'或其他分支形式)来基于它是哪个字符串来做不同的事情。 –