鉴于:
(define output "")
或
(define output "goodInput")
当我在我的代码中运行这些定义时,我得到:
ERROR: In procedure memoization:
ERROR: Bad define placement (define output "").
为什么?
修改
; Formal function of the code
(define (double->sum myString)
(define myVector 0)
(set! myVector (breaking myString))
(define output "")
(define returnValue (checkLegit myVector)) ; check the number of legitimate characters ,they need to be either numbers or "."
(define flag 0)
(if (not(= returnValue (vector-length myVector))) (set! output "Input error") (set! flag (+ flag 1)))
(define i 0) ; the length of the vector
(define count 0) ; the value of all the numbers in the vector
(if
(= flag 1)
(do ()
((= i (vector-length myVector))) ; run until the end of the vector
(cond
((char=? (vector-ref myVector i) #\.) ; check if we found a dot
(set! output (appending output count)) (set! output (appendingStrings output ".")) (set! count 0)
)
(else (set! count (+ count (char->integer(vector-ref myVector i)) )) (set! count (- count 48))
); end of else
) ; end of cond
(set! i (+ i 1)) ; inc "i" by 1
); end of do
) ; end do
; if flag = 1 , then the input is in a correct form
(if (= flag 1) (set! output (appending output count)))
(if (= flag 1)
output
"Input error")
) ; END
答案 0 :(得分:1)
问题不在于字符串定义本身(没有奇怪的字符,或类似的东西),它位于代码中的位置,其中发生了定义:你在里面过程,并且过程中的最后一行不能是define
。尝试在定义后返回一些内容,它应该可以正常工作。
我猜你刚刚开始编写程序,继续执行define
并编写其余的代码。目前,在结尾处使用占位符值,因此解释器不会抱怨:
(define (double->sum myString)
(define myVector 0)
(set! myVector (breaking myString))
(define output "")
'ok)
也是一种风格问题 - 尽管定义和设置这样的变量是可以的,但使用let
表达式来定义局部变量更为惯用。这就是我的意思:
(define (double->sum myString)
(let ((myVector (breaking myString))
(output ""))
'ok))
通过这种方式,您不必使用set!
,它会改变变量并违反Scheme中首选的函数式编程样式。