# Beginning Student Language

- PROGRAM
  - DEF-OR-EXP ...
- DEF-OR-EXP
  - DEFINITION
  - EXPRESSION
- DEFINITION
  - `(`define` (NAME NAME NAME ...) EXPRESSION)`
  - `(`define` NAME EXPRESSION)`
  - `(`define` NAME (`lambda` (NAME NAME ...) EXPRESSION))`
  - `(`define-struct` NAME (NAME ...))`
- EXPRESSION
  - `(NAME EXPRESSION EXPRESSION ...)`
  - `(PRIM-OP EXPRESSION ...)`
  - `(`cond` (EXPRESSION EXPRESSION) (EXPRESSION EXPRESSION) ...)`
  - `(`cond` (EXPRESSION EXPRESSION) ... (`else` EXPRESSION))`
  - `(`if` EXPRESSION EXPRESSION EXPRESSION)`
  - `(`and` EXPRESSION EXPRESSION EXPRESSION ...)`
  - `(`or` EXPRESSION EXPRESSION EXPRESSION ...)`
  - `empty`
  - `NAME`
  - `'NAME`
  - NUMBER
  - `true`
  - `false`
  - STRING
  - CHARACTER
- NAME
  - a sequence of keyboard characters not including: space " , ' ` ( ) [ ] { } | ; #
- PRIM-OPs
  - Numbers: Integers, Rationals, Reals, Complex, Exacts, Inexacts
    - `*` : `(num num num ... -> num)`
    - `+` : `(num num num ... -> num)`
    - `-` : `(num num ... -> num)`
    - `/` : `(num num num ... -> num)`
    - `<` : `(real real real ... -> boolean)`
    - `<=` : `(real real real ... -> boolean)`
    - `=` : `(num num num ... -> boolean)`
    - `>` : `(real real real ... -> boolean)`
    - `>=` : `(real real ... -> boolean)`
    - `abs` : `(real -> real)`
    - `acos` : `(num -> num)`
    - `add1` : `(number -> number)`
    - `angle` : `(num -> real)`
    - `asin` : `(num -> num)`
    - `atan` : `(num -> num)`
    - `ceiling` : `(real -> int)`
    - `complex?` : `(any -> bool)`
    - `conjugate` : `(num -> num)`
    - `cos` : `(num -> num)`
    - `cosh` : `(num -> num)`
    - `current-seconds` : `(-> int)`
    - `denominator` : `(rat -> int)`
    - `e` : `real`
    - `even?` : `(integer -> bool)`
    - `exact->inexact` : `(num -> num)`
    - `exact?` : `(num -> bool)`
    - `exp` : `(num -> num)`
    - `expt` : `(num num -> num)`
    - `floor` : `(real -> int)`
    - `gcd` : `(int int ... -> int)`
    - `imag-part` : `(num -> real)`
    - `inexact->exact` : `(num -> num)`
    - `inexact?` : `(num -> bool)`
    - `integer->char` : `(int -> char)`
    - `integer?` : `(any -> bool)`
    - `lcm` : `(int int ... -> int)`
    - `log` : `(num -> num)`
    - `magnitude` : `(num -> real)`
    - `make-polar` : `(real real -> num)`
    - `max` : `(real real ... -> real)`
    - `min` : `(real real ... -> real)`
    - `modulo` : `(int int -> int)`
    - `negative?` : `(number -> bool)`
    - `number->string` : `(num -> string)`
    - `number?` : `(any -> boolean)`
    - `numerator` : `(rat -> int)`
    - `odd?` : `(integer -> bool)`
    - `pi` : `real`
    - `positive?` : `(number -> bool)`
    - `quotient` : `(int int -> int)`
    - `random` : `(int -> int)`
    - `rational?` : `(any -> bool)`
    - `real-part` : `(num -> real)`
    - `real?` : `(any -> bool)`
    - `remainder` : `(int int -> int)`
    - `round` : `(real -> int)`
    - `sgn` : `(real -> (union 1 #i1.0 0 #i0.0 -1 #i-1.0))`
    - `sin` : `(num -> num)`
    - `sinh` : `(num -> num)`
    - `sqr` : `(num -> num)`
    - `sqrt` : `(num -> num)`
    - `sub1` : `(number -> number)`
    - `tan` : `(num -> num)`
    - `zero?` : `(number -> bool)`
  - Booleans
    - `boolean=?` : `(boolean boolean -> boolean)`
    - `boolean?` : `(any -> boolean)`
    - `not` : `(boolean -> boolean)`
  - Symbols
    - `symbol->string` : `(symbol -> string)`
    - `symbol=?` : `(symbol symbol -> boolean)`
    - `symbol?` : `(any -> boolean)`
  - Lists
    - `append` : `((listof any) ... -> (listof any))`
    - `assq` : `(X (listof (cons X Y)) -> (union false (cons X Y)))`
    - `caaar` : `((cons (cons (cons W (listof Z)) (listof Y)) (listof X)) -> W)`
    - `caadr` : `((cons (cons (cons W (listof Z)) (listof Y)) (listof X)) -> (listof Z))`
    - `caar` : `((cons (cons Z (listof Y)) (listof X)) -> Z)`
    - `cadar` : `((cons (cons W (cons Z (listof Y))) (listof X)) -> Z)`
    - `cadddr` : `((listof Y) -> Y)`
    - `caddr` : `((cons W (cons Z (cons Y (listof X)))) -> Y)`
    - `cadr` : `((cons Z (cons Y (listof X))) -> Y)`
    - `car` : `((cons Y (listof X)) -> Y)`
    - `cdaar` : `((cons (cons (cons W (listof Z)) (listof Y)) (listof X)) -> (listof Z))`
    - `cdadr` : `((cons W (cons (cons Z (listof Y)) (listof X))) -> (listof Y))`
    - `cdar` : `((cons (cons Z (listof Y)) (listof X)) -> (listof Y))`
    - `cddar` : `((cons (cons W (cons Z (listof Y))) (listof X)) -> (listof Y))`
    - `cdddr` : `((cons W (cons Z (cons Y (listof X)))) -> (listof X))`
    - `cddr` : `((cons Z (cons Y (listof X))) -> (listof X))`
    - `cdr` : `((cons Y (listof X)) -> (listof X))`
    - `cons` : `(X (listof X) -> (listof X))`
    - `cons?` : `(any -> boolean)`
    - `eighth` : `((listof Y) -> Y)`
    - `empty?` : `(any -> boolean)`
    - `fifth` : `((listof Y) -> Y)`
    - `first` : `((cons Y (listof X)) -> Y)`
    - `fourth` : `((listof Y) -> Y)`
    - `length` : `(list -> number)`
    - `list` : `(any ... (listof any) -> (listof any))`
    - `list` : `(any ... -> (listof any))`
    - `list*` : `(any ... (listof any) -> (listof any))`
    - `list-ref` : `((listof X) natural-number -> X)`
    - `member` : `(any list -> (union false list))`
    - `memq` : `(any list -> (union false list))`
    - `memv` : `(any list -> (union false list))`
    - `null` : `empty`
    - `null?` : `(any -> boolean)`
    - `pair?` : `(any -> boolean)`
    - `rest` : `((cons Y (listof X)) -> (listof X))`
    - `reverse` : `(list -> list)`
    - `second` : `((cons Z (cons Y (listof X))) -> Y)`
    - `seventh` : `((listof Y) -> Y)`
    - `sixth` : `((listof Y) -> Y)`
    - `third` : `((cons W (cons Z (cons Y (listof X)))) -> Y)`
  - Posns
    - `make-posn` : `(number number -> posn)`
    - `posn-x` : `(posn -> number)`
    - `posn-y` : `(posn -> number)`
    - `posn?` : `(anything -> boolean)`
  - Characters
    - `char->integer` : `(char -> integer)`
    - `char-alphabetic?` : `(char -> boolean)`
    - `char-ci<=?` : `(char char ... -> boolean)`
    - `char-ci<?` : `(char char ... -> boolean)`
    - `char-ci=?` : `(char char ... -> boolean)`
    - `char-ci>=?` : `(char char ... -> boolean)`
    - `char-ci>?` : `(char char ... -> boolean)`
    - `char-downcase` : `(char -> char)`
    - `char-lower-case?` : `(char -> boolean)`
    - `char-numeric?` : `(char -> boolean)`
    - `char-upcase` : `(char -> char)`
    - `char-upper-case?` : `(char -> boolean)`
    - `char-whitespace?` : `(char -> boolean)`
    - `char<=?` : `(char char ... -> boolean)`
    - `char<?` : `(char char ... -> boolean)`
    - `char=?` : `(char char ... -> boolean)`
    - `char>=?` : `(char char ... -> boolean)`
    - `char>?` : `(char char ... -> boolean)`
    - `char?` : `(any -> boolean)`
  - Strings
    - `format` : `(string any ... -> string)`
    - `list->string` : `((listof char) -> string)`
    - `make-string` : `(nat char -> string)`
    - `string` : `(char ... -> string)`
    - `string->list` : `(string -> (listof char))`
    - `string->number` : `(string -> (union number false))`
    - `string->symbol` : `(string -> symbol)`
    - `string-append` : `(string ... -> string)`
    - `string-ci<=?` : `(string string ... -> boolean)`
    - `string-ci<?` : `(string string ... -> boolean)`
    - `string-ci=?` : `(string string ... -> boolean)`
    - `string-ci>=?` : `(string string ... -> boolean)`
    - `string-ci>?` : `(string string ... -> boolean)`
    - `string-copy` : `(string -> string)`
    - `string-length` : `(string -> nat)`
    - `string-ref` : `(string nat -> char)`
    - `string<=?` : `(string string ... -> boolean)`
    - `string<?` : `(string string ... -> boolean)`
    - `string=?` : `(string string ... -> boolean)`
    - `string>=?` : `(string string ... -> boolean)`
    - `string>?` : `(string string ... -> boolean)`
    - `string?` : `(any -> boolean)`
    - `substring` : `(string nat nat -> string)`
  - Images
    - `image=?` : `(image image -> boolean)`
    - `image?` : `(any -> boolean)`
  - Misc
    - `=~` : `(real real non-negative-real -> boolean)`
    - `eof` : `eof`
    - `eof-object?` : `(any -> boolean)`
    - `eq?` : `(any any -> boolean)`
    - `equal?` : `(any any -> boolean)`
    - `equal~?` : `(any any non-negative-real -> boolean)`
    - `eqv?` : `(any any -> boolean)`
    - `error` : `(symbol string -> void)`
    - `exit` : `(-> void)`
    - `identity` : `(any -> any)`
    - `struct?` : `(any -> boolean)`