Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Racket 具有自动类型字段转换的列表到结构转换_Racket - Fatal编程技术网

Racket 具有自动类型字段转换的列表到结构转换

Racket 具有自动类型字段转换的列表到结构转换,racket,Racket,我正在阅读.csv文件并通过 (define-struct my-struct (id name)) (apply my-struct '("5" "Tomas")) (string? (my-struct-id (apply my-struct '("5" "Tomas")))) 将其转换为struct。所有字段都是字符串,但是,是否有一些优雅的方法可以强制string->number转换,例如id字段 非常感谢。在我看来,有两种选择。第一个是最简单的,使用自定义构造函数: ; Option

我正在阅读.csv文件并通过

(define-struct my-struct (id name))
(apply my-struct '("5" "Tomas"))
(string? (my-struct-id (apply my-struct '("5" "Tomas"))))
将其转换为struct。所有字段都是字符串,但是,是否有一些优雅的方法可以强制
string->number
转换,例如
id
字段


非常感谢。

在我看来,有两种选择。第一个是最简单的,使用自定义构造函数:

; Option 1: Make a dedicated constructor that
;           handles the conversion.
(struct my-struct (id name) #:transparent)
(define (create-struct id name)
  (my-struct (string->number id) name))
第二种选择是(ab)使用防护装置:

; Option 2: Use a guard
(define (converter id name the-struct-name)
  (values (string->number id) name))
(struct my-second-struct (id name) #:guard converter #:transparent)

(apply my-second-struct '("5" "Tomas"))

在我看来,有两种选择。第一个是最简单的,使用自定义构造函数:

; Option 1: Make a dedicated constructor that
;           handles the conversion.
(struct my-struct (id name) #:transparent)
(define (create-struct id name)
  (my-struct (string->number id) name))
第二种选择是(ab)使用防护装置:

; Option 2: Use a guard
(define (converter id name the-struct-name)
  (values (string->number id) name))
(struct my-second-struct (id name) #:guard converter #:transparent)

(apply my-second-struct '("5" "Tomas"))

为了完成soegaard的回答,如果您提供了结构并在其他模块中使用它,您还可以添加一个契约以防止错误使用:

#lang racket/base
(require racket/contract)
(provide (contract-out
          [struct person ((id number?) (name string?))]))

(struct person (id name))
>(需要我的模块/个人)
>(第42人“玛格丽特”)
#
>(人“haxxor”1337)
; 人:违反合同
;   预期:数字?
;   给出:“haxxor”
;   in:的第一个参数
;       (->数字?字符串?人?)

请参阅此处的完整文档:

要完成soegaard的回答,如果您提供了结构并在其他模块中使用它,还可以添加一个契约以防止错误使用:

#lang racket/base
(require racket/contract)
(provide (contract-out
          [struct person ((id number?) (name string?))]))

(struct person (id name))
>(需要我的模块/个人)
>(第42人“玛格丽特”)
#
>(人“haxxor”1337)
; 人:违反合同
;   预期:数字?
;   给出:“haxxor”
;   in:的第一个参数
;       (->数字?字符串?人?)

请参阅此处的完整文档:

(应用我的结构(映射字符串->数字)(“5”“Tomas”))
?这打破了drracket…除此之外,我只希望将“5”转换为数字,而不是将“tomast”转换为数字。fI希望采用某种更自动的方式,例如:
定义结构我的结构(id::数字名称))
(应用我的结构(映射字符串->数字“(“5”“Tomas”)
?这打破了drracket…除此之外,我只希望将“5”转换为数字,而不希望将“tomast”转换为#fI希望使用某种更自动的方式,例如:
定义结构我的结构(id#:number name))
谢谢,如果我只能接受两个答案,我也会使用合同。谢谢,如果我只能接受两个答案,我也会使用合同。与选项1相关:当一个人想要提供一个带有修改过的构造函数的结构时,他可以这样做:
(提供(除了out(struct out person)person)(重命名为out[make person])
与选项1相关:当想要提供一个带有修改过的构造函数的结构时,可以这样做:
(提供(除了out(struct out person)person)(重命名out[make person])