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 に答える