diff --git a/doc/lbmref.md b/doc/lbmref.md index 20ee0516..6d9ee724 100644 --- a/doc/lbmref.md +++ b/doc/lbmref.md @@ -1,112 +1,5 @@ # LispBM language reference -* [LispBM language reference](#lispbm-language-reference) - * [Arithmetic](#arithmetic) - * [-](#-) - * [*](#-1) - * [/](#-2) - * [mod](#mod) - * [Comparisons](#comparisons) - * [eq](#eq) - * [=](#-3) - * [>](#-4) - * [<](#-5) - * [Boolean operators](#boolean-operators) - * [and](#and) - * [or](#or) - * [not](#not) - * [Bit level operations](#bit-level-operations) - * [shl](#shl) - * [shr](#shr) - * [bitwise-and](#bitwise-and) - * [bitwise-or](#bitwise-or) - * [bitwise-xor](#bitwise-xor) - * [bitwise-not](#bitwise-not) - * [Low level operations](#low-level-operations) - * [encode-i32](#encode-i32) - * [encode-u32](#encode-u32) - * [encode-float](#encode-float) - * [decode](#decode) - * [nil and t](#nil-and-t) - * [nil](#nil) - * [t](#t) - * [Quotes and Quasiquotation](#quotes-and-quasiquotation) - * [quote](#quote) - * [`](#-6) - * [,](#-7) - * [,@](#-8) - * [Built-in operations](#built-in-operations) - * [eval](#eval) - * [eval-program](#eval-program) - * [type-of](#type-of) - * [sym-to-str](#sym-to-str) - * [str-to-sym](#str-to-sym) - * [sym-to-u](#sym-to-u) - * [u-to-sym](#u-to-sym) - * [is-fundamental](#is-fundamental) - * [Special forms](#special-forms) - * [if](#if) - * [lambda](#lambda) - * [closure](#closure) - * [let](#let) - * [define](#define) - * [progn](#progn) - * [read](#read) - * [read-program](#read-program) - * [Lists and cons cells](#lists-and-cons-cells) - * [car](#car) - * [cdr](#cdr) - * [cons](#cons) - * [.](#-9) - * [list](#list) - * [append](#append) - * [ix](#ix) - * [set-car](#set-car) - * [set-cdr](#set-cdr) - * [Arrays](#arrays) - * [array-read](#array-read) - * [array-write](#array-write) - * [Pattern-matching](#pattern-matching) - * [match](#match) - * [_](#_) - * [?](#-10) - * [?i28](#i28) - * [?u28](#u28) - * [?float](#float) - * [Concurrency](#concurrency) - * [spawn](#spawn) - * [wait](#wait) - * [yield](#yield) - * [Message-passing](#message-passing) - * [send](#send) - * [recv](#recv) - * [Macros](#macros) - * [macro](#macro) - * [Call With Current Continuation](#call-with-current-continuation) - * [Unparsable symbols](#unparsable-symbols) - * [no_match](#no_match) - * [read_error](#read_error) - * [type_error](#type_error) - * [eval_error](#eval_error) - * [out_of_memory](#out_of_memory) - * [fatal_error](#fatal_error) - * [out_of_stack](#out_of_stack) - * [division_by_zero](#division_by_zero) - * [variable_not_bound](#variable_not_bound) - * [Types](#types) - * [type-list](#type-list) - * [type-i28](#type-i28) - * [type-u28](#type-u28) - * [type-float](#type-float) - * [type-i32](#type-i32) - * [type-u32](#type-u32) - * [type-array](#type-array) - * [type-symbol](#type-symbol) - * [type-char](#type-char) - * [type-ref](#type-ref) - * [type-stream](#type-stream) - - ## Arithmetic ### + @@ -734,6 +627,42 @@ Example ```clj (define apa 10) ``` +--- + +### set! + +The `set!` form is used to change the value of some variable in an environment. +You can use `set!` to change the value of a global definition, a local definition +or a variable defintion (`#var`). An application of the `set!` form looks like +`(set! var-expr val-expr)` where `var-expr` should evaluate to a symbol. The `val-expr` is evaluated before +rebinding the variable. + +Examples: +```clj +(define a 10) +``` +The variable `a` is now `10` in the global environment. +```clj +(set! 'a 20) +``` +Now, the value of `a` will be 20. Note that `a` is quoted in the `set!` form application +while it is not in the `define` form. This is because `define` requires the first +argument to be a symbol while the `set!` form requires the first argument to evaluate +into a symbol. + +You can also set the value of a let bound variable. +```clj +(let ((a 10)) (set! 'a 20)) +``` + +And you can change the value of a `#var`. + +```clj +(define #a 10) + +(set '#a 20) +``` +`#a` is now 20. ---