Then would something like this work? #lang racket (provide (all-defined-out) #%datum #%top (rename-out [new-module-begin #%module-begin]))
(define-syntax-rule (new-module-begin med-thing ...) (#%module-begin (displayln (parse-meds (list med-thing ...))))) (define (parse-meds lst) (match lst [(list) ""] [(list-rest MED QUANT FORM POS (? inst? INST) rest) (~a MED " " line " " QUANT " " FORM "\n" POS "\n" INST "\n" (parse rest))] [(list-rest MED QUANT FORM POS rest) (~a MED " " line " " QUANT " " FORM "\n" POS "\n" (parse rest))])) (define hctz25 "Hydrochlorothiazide 25mg") (define simva20 "Simvastatin 20mg") (define pl "pills") (define 1xd "Take 1 pill P.O. 1x/day") (define 1xn "Take 1 pill P.O. 1x at night") (define INSTOMZ "half an hour before breakfast, with a glass of water") (define line "-----------") (define (inst? x) (equal? x INSTOMZ)) On Aug 4, 2014, at 1:22 AM, Henry Lenzi <henry.le...@gmail.com> wrote: > Hello Alex -- > > This is nice, the problem is separating the output into the proper > formatting. I feel this has to be done a step before the expansion > into the string form. > One thing I'm considering is that that the DSL is made of MED QUANT > FORM POS or MED QUANT FOR POS INST, so 4 or 5 items. > If we have a symbol list (before string expansion), than we can treat > INST as the divider marker. Otherwise, there's a linebreak at every > fourth item. > > I'm looking into how to to this using a position function: > (define (position item list) > (- (length list) > (length (member item list)))) > > Knowing where the INST instructions occur help up decided whether we > can break a line into the > MED QUANT FORM > POS > or > MED QUANT FORM > POS > INST > > forms (see the code snippet on http://pasterack.org/pastes/14535 ) > > > Cheers, > > Henry > > On Mon, Aug 4, 2014 at 1:23 AM, Alexander D. Knauth > <alexan...@knauth.org> wrote: >> Would this work for what you want? >> >> If med.rkt contains this: >> #lang racket >> >> (provide (all-defined-out) >> #%datum #%top >> (rename-out [new-module-begin #%module-begin])) >> >> (define-syntax-rule >> (new-module-begin med-thing ...) >> (#%module-begin (display (~a med-thing ... #:separator " ")))) >> >> (define hctz25 "Hydrochlorothiazide 25mg") >> (define simva20 "Simvastatin 20mg") >> (define pl "pills") >> (define 1xd "Take 1 pill P.O. 1x/day") >> (define 1xn "Take 1 pill P.O. 1x at night") >> (define INSTOMZ "half an hour before breakfast, with a glass of water") >> (define line "-----------") >> >> And try-it.rkt contains this: >> #lang s-exp "med.rkt" >> hctz25 30 pl 1xd >> simva20 30 pl 1xn >> >> Then running try-it.rkt will produce the output: >> Hydrochlorothiazide 25mg 30 pills Take 1 pill P.O. 1x/day Simvastatin 20mg >> 30 pills Take 1 pill P.O. 1x at night >> >> Or if new-module-begin is defined like this instead: >> (define-syntax-rule >> (new-module-begin med-thing ...) >> (#%module-begin (provide data) (define data (~a med-thing ... #:separator >> " ")))) >> >> Then doing (require “try-it.rkt”) will import data as the string >> "Hydrochlorothiazide 25mg 30 pills Take 1 pill P.O. 1x/day Simvastatin 20mg >> 30 pills Take 1 pill P.O. 1x at night". >> >> >>
____________________ Racket Users list: http://lists.racket-lang.org/users