2017-08-28 11 views
0

と生のバイナリデータを処理する私はラケットラングに新しいですし、以前私は、次のタスクを実行する方法を把握しようとしています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 

、ルック、意味を成しませんの?

+0

ヌルターミネータのないC文字列とは何ですか? –

+0

どのコードを試しましたか? –

+0

@benrudgers C文字列は "abc \ 0"のようなもので、 '\ 0'はヌル文字です。私が解析している入力は0x0a 3 'a' 'b' 'c'のようなものです。私が試したコードに関して:配列を横断し、コード化されていない値を別の配列に格納する関数。コードを投稿してくれて申し訳ありませんが、まだ混乱しています。 – Kumar

答えて

0

オペレーティングシステムに値を返すには、(exit [v]).を使用します。他の値は、おそらく標準出力および/または標準エラーになるはずです。これは、プログラムが終了する前にそれらを書き込むことを意味します。

配列の値を変数に代入するには、関数とモジュール内およびモジュール間でどのように語彙スコープが作用するかによってさまざまな方法があります。セマンティクスとバリューセマンティクスの参照も考慮する。

最後に、byte-stringを処理するときに、明示的なループで再帰を選択する理由はありません。 bytes-lengthは、C言語で実装された低レベルのプリミティブであり、空のバイト列をテストすることなくループに必要な長さを返します。

+0

Schemeシステムのループは、再帰のための文法的な砂糖ですが、抽象を追加するだけです。 – Sylwester

+0

再帰vsループに関しては、ありがとう、私はそれを得た! – Kumar

+0

@Sylwester C配列の質問中心に記述された抽象概念。再帰+配列は機能しますが、それは疑わしい抽象の組み合わせです。とにかく、反復の帽子の先端なしでは、尻尾の再帰を使わない理由は全くありません...フォンノイマンのアーキテクチャの底にあるカメは反復であり、再帰は押されると常に構文的な砂糖です押さえつける。 –