1

鉴于:

(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
4

1 回答 1

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 中首选的函数式编程风格。

于 2012-12-16T15:31:58.767 回答