dev-elider-3
Matthew Butterick 8 years ago
parent 44bbd16a32
commit 4573519a50

@ -1,2 +0,0 @@
#lang info
(define collection "stacker")

@ -1,6 +0,0 @@
#lang reader "stacker-lang.rkt"
push 4
push 8
+
push 3
*

@ -1,12 +1,14 @@
#lang br
(define (read-syntax src-path src-port)
(define src-strs (port->lines src-port))
(define (make-datum str) (format-datum '(dispatch ~a) str))
(define src-exprs (map make-datum src-strs))
(inject-syntax ([#'(list src-expr ...) src-exprs])
#'(module stacker-mod "stacker-lang.rkt"
src-expr ...)))
(provide read-syntax)
(module reader br
(define (read-syntax src-path src-port)
(define src-strs (port->lines src-port))
(define (make-datum str) (format-datum '(dispatch ~a) str))
(define src-exprs (map make-datum src-strs))
(inject-syntax ([#'(list src-expr ...) src-exprs])
#'(module stacker-mod "stacker-lang.rkt"
src-expr ...)))
(provide read-syntax))
(define #'(stacker-module-begin reader-line ...)
#'(#%module-begin

@ -0,0 +1,6 @@
#lang reader (submod "stacker-lang.rkt" reader)
push 4
push 8
+
push 3
*

@ -1,40 +0,0 @@
#lang at-exp br
(require scribble/manual scribble/core txexpr)
(provide scribble->xexpr)
(define (style->attrs s style-accessor)
(let* ([style-datum (style-accessor s)])
(if (style? style-datum) ; either style struct, or simple symbol name
`((style ,(~a (style-name style-datum)))
(properties ,(string-join (map ~a (style-properties style-datum)) " ")))
`((style ,(~a style-datum))))))
;; Unfortunately there seems to be no generic way of fetching the style & elements from a Scribble structure
;; the specific struct accessors must be used.
(define #'structure->txexpr
(λ(stx)
(syntax-match stx
[#'(_ structure-name elem-name id)
(syntax-let ([#'structure-name-elem-name (format-id stx "~a-~a" #'structure-name #'elem-name)]
[#'structure-name-style (format-id stx "~a-style" #'structure-name)])
#'(let* ([elem-raw (structure-name-elem-name id)]
[elems (map scribble->xexpr (if (list? elem-raw)
(flatten elem-raw)
(list elem-raw)))])
(list* 'structure-name (style->attrs id structure-name-style) elems)))])))
(define (scribble->xexpr s)
(cond
[(nested-flow? s) (structure->txexpr nested-flow blocks s)]
[(paragraph? s) (structure->txexpr paragraph content s)]
[(element? s) (structure->txexpr element content s)]
[else s]))
(module+ test
(require rackunit)
(define-simple-check (check-sx? s)
(check-true (txexpr? (scribble->xexpr s))))
(check-sx? @racketblock[(list +)])
(check-sx? @racket[(list +)])
(check-sx? @code{(list +)}))

@ -0,0 +1,5 @@
#lang racket/base
(provide message)
(define message "You installed beautiful-racket correctly.")
(module+ main
(displayln message))
Loading…
Cancel
Save