使用Racket处理原始二进制数据

时间:2017-08-28 08:33:11

标签: racket

我是Racket Lang的新手,之前我用C ++,Java和C编写了数千行代码。我正在试图弄清楚如何执行以下任务:

  • 给定一个数组(如C uint8_t数组),格式如下:

    • 第一个字节用于表示"格式",让我们说这可能是0x0a,0x0b等等。
    • 剩余数据可能包含没有空终止符和整数的C字符串。
  • 编写一个解析数组并将值放在某些变量中的函数。

在问这里之前,我正在阅读:https://docs.racket-lang.org/guide以及https://docs.racket-lang.org/reference

我的方法如下:

  • 我使用的是字节字符串,因为它似乎可以用来模仿C ++ / C数组。
  • 我正在使用尾递归来遍历"数组"。

问题:

1)在C中,我总是使用函数的返回值作为错误代码:0表示正常,任何负值都是错误。使用Racket,我使用多个返回值来表示:a)返回码,b)处理后的值,即:

(值return_code out1 out2 ...)

你怎么看?您是否建议使用异常进行错误处理?

2)在Racket中处理数组的最佳方法是什么?我的意思是,根据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

看看我如何使用(值...)的东西,这有意义吗?

1 个答案:

答案 0 :(得分:0)

要将值返回给操作系统,请使用(exit [v]).。其他值应该可能是标准输出和/或标准错误。这意味着在程序退出之前编写它们。

在将数组的值赋给变量方面,有很多方法可以实现,具体取决于词法范围在函数和模块中以及跨模块的作用。此外,还需要考虑引用语义与值语义。

最后,在处理byte-string时,没有令人信服的理由在显式循环上选择递归。 bytes-length是在C中实现的低级基元,它将返回循环所需的长度而不测试空字节串。