1

文字列で表される整数を取得する関数を作成し、彼のすべての文字が数字であるかどうかを確認し、それに応じて#t\を返すようにしてい#fます。それがコードです-

(define (splitString str) (list->vector (string->list str)))

(define myVector 0)
(define flag #t)

(define (checkIfStringLegal str) (
(set! myVector (splitString str))
(do (  (i 0 (+ i 1))  )  ; init
  ((= i (vector-length myVector)) flag) ; stop condition
  (cond ((>= 48 (char->integer (vector-ref myVector i)) ) (set! flag #f))
        ((<= 57 (char->integer (vector-ref myVector i)) )(set! flag #f))


  )    
)
) 
) 

説明はほとんどありません-

(list->vector (string->list str))-文字列をcharリストに変換します。

(vector-ref myVector i)myVector--その場所からのchar i

実行はOKですが、この関数を使おうとすると、次のよう(checkIfStringLegal "444")になります-

application: not a procedure;
 expected a procedure that can be applied to arguments
  given: #<void>
  arguments...:
   #t
4

1 に答える 1

2

これを試して:

(define (checkIfStringLegal str)
  (andmap char-numeric?
          (string->list str)))

手順は次のとおりです。

  1. を使用して、文字列を文字のリストに変換しますstring->list
  2. char-numeric?リスト内の各文字を検証して、それが数字であるかどうかを確認し、それぞれに述語を適用します
  3. すべての検証が返された場合#tandmapはを返し#tます。単一の検証が失敗した場合、すぐandmapに戻ります#f

これは関数型プログラミングの解決策です(そして結局のところ、この質問はそのようにタグ付けされています)、意図したアプローチは、ベクトル、明示的なループ構造(do)、突然変異操作(set!)を使用したCのようなプログラミング言語の解決策のように見えることに注意してください、グローバルな可変定義...これは問題なく、微調整を加えると最終的には機能する可能性がありますが、Schemeで物事を行うための慣習的な方法ではなく、関数型プログラミングソリューションでもありません。

編集:

ああ、私はあきらめます。あなたが自分のやり方で解決策を書きたいのなら、これはうまくいくでしょう-あなたは括弧の問題を抱えていました、そしてSchemeで括弧をインデントして閉じる適切な方法に注意してください、それはあなたと他の人にとってあなたのコードをより読みやすくします:

(define (splitString str) (list->vector (string->list str)))
(define myVector 0)
(define flag #t)

(define (checkIfStringLegal str)
  (set! myVector (splitString str))
  (do ((i 0 (+ i 1)))
    ((= i (vector-length myVector)) flag)
    (cond ((>= 48 (char->integer (vector-ref myVector i)))
           (set! flag #f))
          ((<= 57 (char->integer (vector-ref myVector i)))
           (set! flag #f)))))

それでも、コードはさらに改善される可能性があります。読者のための演習として残しておきます。

  • を使用して、両方の条件を1つの条件にまとめることができます。or
  • 終了条件は次のとおりです。ベクトルの終わりに達したとき、またはフラグがfalseのときにループを終了します。
于 2012-12-16T23:39:43.533 に答える