と生のバイナリデータを処理する私はラケットラングに新しいですし、以前私は、次のタスクを実行する方法を把握しようとしていますC++、JavaとCのコードの行数千人を書いた:ラケット
は次の形式を持つ(C uint8_t配列のような)配列を指定:
- 最初のバイトは、「フォーマット」を示すために使用される、のはこれがそうでは0x0A、0x0Bのと可能性がありましょう。
- 残りのデータには、NULL終端文字と整数を持たないC文字列を含めることができます。
配列を解析して値をいくつかの変数に格納する関数を記述します。 https://docs.racket-lang.org/guideを、次のようにもhttps://docs.racket-lang.org/reference
私のアプローチは、次のとおりです:
ここで尋ねる前に、私は読んでいた
- を、模倣するために使用することができそうですので、私はバイト文字列を使用していますC++/C配列。
- 私はテール再帰を使用して "配列"を走査しています。
質問:
1)Cで、私はいつも、エラーコードとして、関数の戻り値を使用する:0はOKであり、任意の負の値はエラーです。ラケットで、私は示すために、複数の戻り値を使用しています。a)リターンコード、b)の処理値(複数可)、すなわち、何かのように:
(値は... OUT1 OUT2をreturn_codeを)
何をあなたは考える?エラー処理に例外の使用をお勧めしますか?
2)Racketでアレイを処理する最良の方法は何ですか?私は、ラケットが提供する最高のパフォーマンスを達成することを意味します。
ありがとうございます!
EDIT1
:私の最初の質問(リターンコード)について は、私は多くの機能を呼び出していると私は、関数内でエラーが発生した場合は私が知っているのに役立ちます終了コードを返すようにしたいと思います。これはサンプルコードです:#lang racket
(define (is_valid in)
(cond
[(and (>= in 10) (<= in 15)) #t]
[else #f]))
(define (copy_values in)
(define len (bytes-ref in 2))
; 3 is where the string "ABCD" begins
(define str (subbytes in 3 (+ 3 len)))
(define numbers (subbytes in (+ 3 len)))
(values str numbers))
(define (parse in)
(define type (bytes-ref in 0))
(if (is_valid type)
(let()
(define-values (str numbers) (copy_values in))
(values #t str numbers))
(values #f 0 0)))
; format: type strlen
; len |-- str --| | -- numbers -- |
;
(define input1 (bytes 10 10 4 65 66 67 68 110 120 130 140 150))
(define input2 (bytes 1 10 4 65 66 67 68 110 120 130 140 150))
(parse input1)
(parse input2)
これはDrRacketで出力されます:私は(値...)のものを使用する方法
Welcome to DrRacket, version 6.7 [3m].
Language: racket, with debugging; memory limit: 128 MB.
#t
#"ABCD"
#"nx\202\214\226"
#f
0
0
、ルック、意味を成しませんの?
ヌルターミネータのないC文字列とは何ですか? –
どのコードを試しましたか? –
@benrudgers C文字列は "abc \ 0"のようなもので、 '\ 0'はヌル文字です。私が解析している入力は0x0a 3 'a' 'b' 'c'のようなものです。私が試したコードに関して:配列を横断し、コード化されていない値を別の配列に格納する関数。コードを投稿してくれて申し訳ありませんが、まだ混乱しています。 – Kumar