bsl/language.rkt
#lang racket

#|

File: language.rkt
Author: Bill Turtle (wrturtle)

Defines the parenthesized version of Pyret BSL (pypar)

|#

;; -----------------------------------------------------------------------------
;; Hash percents

(require (prefix-in pysem: "../semantics/hash-percents.rkt"))
(require (prefix-in pysem: (only-in "../semantics/beginner-syntax.rkt"
                                    test)))

(provide (rename-out [module-begin #%module-begin]
                     [pysem:#%top #%top]
                     [pysem:#%datum #%datum]
                     [pysem:#%app #%app])
         #%top-interaction)
         

(define-syntax (module-begin stx)
  (syntax-case stx ()
    [(_ body ...)
     (syntax/loc stx
       (pysem:#%module-begin body ... (pysem:test)))]))

;; -----------------------------------------------------------------------------
;; Pre-defined variables

;; ditto
(require (prefix-in pysem: "../semantics/pre-defined.rkt"))
(provide (rename-out [pysem:empty empty]
                     [pysem:True True]
                     [pysem:False False]))


;; -----------------------------------------------------------------------------
;; Template variables

(require (prefix-in pysem: "../semantics/templates.rkt"))
(provide (rename-out [pysem:.. ..]
                     [pysem:... ...]
                     [pysem:.... ....]
                     [pysem:..... .....]
                     [pysem:...... ......]))

;; -----------------------------------------------------------------------------
;; syntax

; fun, def
(require "../language/fundef.rkt")
(require (prefix-in pysem: "../semantics/define.rkt"))
(make-fun-and-def fun def pysem:beginner-fun pysem:beginner-def)
(provide fun def)

; structs, lookup
; (no indentation-checking)
(require "../semantics/structures.rkt")
(provide (rename-out [beginner-define-struct define-struct]))
(require "../semantics/lookup.rkt")
(provide (rename-out [beginner-lookup lookup]))

; if
(require (prefix-in pypar: "../language/beginner-syntax.rkt"))
(provide (rename-out [pypar:if if]
                     [pypar:else else]
                     [pypar:elif elif]
                     [pypar:done done]))

; sequences
(require "../language/sequences.rkt")
(provide (all-from-out "../language/sequences.rkt"))

; infix
(require "../language/infix.rkt")
(provide (all-from-out "../language/infix.rkt"))

; tests
(require "../language/testing.rkt")
(provide (all-from-out "../language/testing.rkt"))


;; ----------------------------------------------------------------------------
;; built-in functions

(require racket/provide)
(require (prefix-in fo: (except-in "../semantics/first-order-beginner-funs.rkt" + - * / < <= = >= > not)))
(provide (filtered-out
          (lambda (name)
            (and (regexp-match? #rx"fo:" name)
                 (regexp-replace #rx"fo:" name "")))
          (all-from-out "../semantics/first-order-beginner-funs.rkt")))

(require "../teachpacks/first-order-batch-io.rkt")
(provide (all-from-out "../teachpacks/first-order-batch-io.rkt"))
(require "../teachpacks/first-order-image.rkt")
(provide (all-from-out "../teachpacks/first-order-image.rkt"))
(require "../teachpacks/first-order-universe.rkt")
(provide (all-from-out "../teachpacks/first-order-universe.rkt"))