Racket 具有自动类型字段转换的列表到结构转换
我正在阅读.csv文件并通过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
(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])