我是Racket Lang的新手,之前我用C ++,Java和C编写了数千行代码。我正在试图弄清楚如何执行以下任务:
给定一个数组(如C uint8_t数组),格式如下:
编写一个解析数组并将值放在某些变量中的函数。
在问这里之前,我正在阅读:https://docs.racket-lang.org/guide以及https://docs.racket-lang.org/reference
我的方法如下:
问题:
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
看看我如何使用(值...)的东西,这有意义吗?
答案 0 :(得分:0)
要将值返回给操作系统,请使用(exit [v]).。其他值应该可能是标准输出和/或标准错误。这意味着在程序退出之前编写它们。
在将数组的值赋给变量方面,有很多方法可以实现,具体取决于词法范围在函数和模块中以及跨模块的作用。此外,还需要考虑引用语义与值语义。
最后,在处理byte-string
时,没有令人信服的理由在显式循环上选择递归。 bytes-length
是在C中实现的低级基元,它将返回循环所需的长度而不测试空字节串。