1.9 Converters
(require rebellion/base/converter) | package: rebellion |
A converter is an object that can convert back and forth between two kinds of values: the converter’s conversion domain and conversion range. Converters need not be exact one-to-one mappings, more commonly a converter is lossy and may lose some information by normalizing converted values. However, repeatedly converting a value back and forth is not expected to lose more information than converting it back and forth a single time. Converters are typically named in the pattern domain<->range.
> (convert-forward number<->string 42) "42"
> (convert-backward number<->string "42") 42
> (convert-backward number<->string "7.500") 7.5
procedure
(converter? v) → boolean?
v : any/c
procedure
(convert-forward converter input) → any/c
converter : converter? input : any/c
> (convert-forward number<->string 42) "42"
> (convert-forward string<->symbol "apple") 'apple
procedure
(convert-backward converter input) → any/c
converter : converter? input : any/c
> (convert-backward number<->string "100") 100
> (convert-backward string<->symbol 'banana) "banana"
procedure
(make-converter forward-function backward-function [ #:name name]) → converter? forward-function : (-> any/c any/c) backward-function : (-> any/c any/c) name : (or/c interned-symbol? #false) = #false
(define lowercase<->uppercase (make-converter string-upcase string-downcase))
> (convert-forward lowercase<->uppercase "foo") "FOO"
> (convert-backward lowercase<->uppercase "FOO") "foo"
> (convert-forward lowercase<->uppercase "Foo") "FOO"
procedure
(converter/c domain-contract range-contract) → contract? domain-contract : contract? range-contract : contract?
1.9.1 Predefined Converters
value
> (convert-forward number<->string 42) "42"
> (convert-backward number<->string "42") 42
value
> (convert-forward string<->symbol "grape") 'grape
> (convert-backward string<->symbol 'pineapple) "pineapple"
> (convert-backward string<->symbol (gensym)) "g966174"
value
> (convert-forward string<->keyword "jazz") '#:jazz
> (convert-backward string<->keyword '#:blues) "blues"
value
> (convert-forward symbol<->keyword 'coffee) '#:coffee
> (convert-backward symbol<->keyword '#:tea) 'tea
> (convert-forward symbol<->keyword (string->unreadable-symbol "juice")) '#:juice
> (convert-forward symbol<->keyword (gensym)) '#:g967633
value
> (convert-forward identity-converter "coffee") "coffee"
> (convert-backward identity-converter 42) 42
1.9.2 Converter Utilities
procedure
(converter-flip converter) → converter?
converter : converter?
(define string<->number (converter-flip number<->string))
> (convert-forward string<->number "42") 42
> (convert-backward string<->number 79) "79"
procedure
(converter-pipe converter ...) → converter?
converter : converter?
(define number<->keyword (converter-pipe number<->string string<->keyword))
> (convert-forward number<->keyword 42) '#:42
> (convert-backward number<->keyword '#:375) 375