diff options
-rwxr-xr-x | doc/docs.txt | 4 | ||||
-rwxr-xr-x | doc/manual.txt | 103 | ||||
-rwxr-xr-x | doc/tut1.txt | 11 | ||||
-rw-r--r-- | lib/core/marshal.nim | 24 | ||||
-rwxr-xr-x | lib/pure/os.nim | 24 | ||||
-rwxr-xr-x | lib/pure/strutils.nim | 1 | ||||
-rwxr-xr-x | rod/docgen.nim | 4 | ||||
-rwxr-xr-x | todo.txt | 1 |
8 files changed, 100 insertions, 72 deletions
diff --git a/doc/docs.txt b/doc/docs.txt index 6f4fddf16..cb9d1f9d6 100755 --- a/doc/docs.txt +++ b/doc/docs.txt @@ -31,5 +31,5 @@ The documentation consists of several documents: this if you want to hack the compiler. - | `Index <theindex.html>`_ - | The generated index. Often the quickest way to find the piece of - information you need. + | The generated index. **Index + (Ctrl+F) == Joy** + diff --git a/doc/manual.txt b/doc/manual.txt index 06accc953..7c0619ba7 100755 --- a/doc/manual.txt +++ b/doc/manual.txt @@ -193,18 +193,19 @@ contain the following `escape sequences`:idx:\ : ``\\`` `backslash`:idx: ``\"`` `quotation mark`:idx: ``\'`` `apostrophe`:idx: - ``\d+`` `character with decimal value d`:idx:; + ``\`` '0'..'9'+ `character with decimal value d`:idx:; all decimal digits directly following are used for the character ``\a`` `alert`:idx: ``\b`` `backspace`:idx: ``\e`` `escape`:idx: `[ESC]`:idx: - ``\xHH`` `character with hex value HH`:idx:; + ``\x`` HH `character with hex value HH`:idx:; exactly two hex digits are allowed ================== =================================================== -Strings in Nimrod may contain any 8-bit value, except embedded zeros. +Strings in Nimrod may contain any 8-bit value, even embedded zeros. However +some operations may interpret the first binary zero as terminator. Triple quoted string literals @@ -947,44 +948,44 @@ To deal with untraced memory, the procedures ``alloc``, ``dealloc`` and further information. If a reference points to *nothing*, it has the value ``nil``. - -Special care has to be taken if an untraced object contains traced objects like -traced references, strings or sequences: in order to free everything properly, -the built-in procedure ``GCunref`` has to be called before freeing the untraced -memory manually: - -.. code-block:: nimrod - type - TData = tuple[x, y: int, s: string] - - # allocate memory for TData on the heap: - var d = cast[ptr TData](alloc0(sizeof(TData))) - - # create a new string on the garbage collected heap: - d.s = "abc" - - # tell the GC that the string is not needed anymore: - GCunref(d.s) - - # free the memory: - dealloc(d) - -Without the ``GCunref`` call the memory allocated for the ``d.s`` string would -never be freed. The example also demonstrates two important features for low -level programming: the ``sizeof`` proc returns the size of a type or value -in bytes. The ``cast`` operator can circumvent the type system: the compiler -is forced to treat the result of the ``alloc0`` call (which returns an untyped -pointer) as if it would have the type ``ptr TData``. Casting should only be -done if it is unavoidable: it breaks type safety and bugs can lead to -mysterious crashes. - -**Note**: The example only works because the memory is initialized with zero -(``alloc0`` instead of ``alloc`` does this): ``d.s`` is thus initialized to -``nil`` which the string assignment can handle. You need to know low level -details like this when mixing garbage collected data with unmanaged memory. + +Special care has to be taken if an untraced object contains traced objects like +traced references, strings or sequences: in order to free everything properly, +the built-in procedure ``GCunref`` has to be called before freeing the untraced +memory manually: + +.. code-block:: nimrod + type + TData = tuple[x, y: int, s: string] + + # allocate memory for TData on the heap: + var d = cast[ptr TData](alloc0(sizeof(TData))) + + # create a new string on the garbage collected heap: + d.s = "abc" + + # tell the GC that the string is not needed anymore: + GCunref(d.s) + + # free the memory: + dealloc(d) + +Without the ``GCunref`` call the memory allocated for the ``d.s`` string would +never be freed. The example also demonstrates two important features for low +level programming: the ``sizeof`` proc returns the size of a type or value +in bytes. The ``cast`` operator can circumvent the type system: the compiler +is forced to treat the result of the ``alloc0`` call (which returns an untyped +pointer) as if it would have the type ``ptr TData``. Casting should only be +done if it is unavoidable: it breaks type safety and bugs can lead to +mysterious crashes. + +**Note**: The example only works because the memory is initialized with zero +(``alloc0`` instead of ``alloc`` does this): ``d.s`` is thus initialized to +``nil`` which the string assignment can handle. You need to know low level +details like this when mixing garbage collected data with unmanaged memory. .. XXX finalizers for traced objects - + Procedural type ~~~~~~~~~~~~~~~ @@ -1750,17 +1751,17 @@ Syntax:: The direct embedding of `assembler`:idx: code into Nimrod code is supported by the unsafe ``asm`` statement. Identifiers in the assembler code that refer to Nimrod identifiers shall be enclosed in a special character which can be -specified in the statement's pragmas. The default special character is ``'`'``: - -.. code-block:: nimrod - proc addInt(a, b: int): int {.pure.} = - # a in eax, and b in edx - asm """ - mov eax, `a` - add eax, `b` - jno theEnd - call `raiseOverflow` - theEnd: +specified in the statement's pragmas. The default special character is ``'`'``: + +.. code-block:: nimrod + proc addInt(a, b: int): int {.pure.} = + # a in eax, and b in edx + asm """ + mov eax, `a` + add eax, `b` + jno theEnd + call `raiseOverflow` + theEnd: """ If expression @@ -2809,7 +2810,7 @@ a dynamic library (``.dll`` files for Windows, ``lib*.so`` files for UNIX). The non-optional argument has to be the name of the dynamic library: .. code-block:: Nimrod - proc gtk_image_new(): PGtkWidget {. + proc gtk_image_new(): PGtkWidget {. cdecl, dynlib: "libgtk-x11-2.0.so", importc.} In general, importing a dynamic library does not require any special linker diff --git a/doc/tut1.txt b/doc/tut1.txt index a06696878..dfd6bd1d5 100755 --- a/doc/tut1.txt +++ b/doc/tut1.txt @@ -17,11 +17,13 @@ Introduction This document is a tutorial for the programming language *Nimrod*. After this -tutorial you will have a decent knowledge about Nimrod. This tutorial assumes +tutorial you will have a decent knowledge of Nimrod. This tutorial assumes that you are familiar with basic programming concepts like variables, types or statements. + + The first program ================= @@ -44,10 +46,15 @@ appending them after the filename:: nimrod compile --run greetings.nim arg1 arg2 -The most used commands and switches have abbreviations, so you can also use:: +Commonly used commands and switches have abbreviations, so you can also use:: nimrod c -r greetings.nim +To compile a `release`:idx: version use:: + + nimrod c -d:release greetings.nim + + Though it should be pretty obvious what the program does, I will explain the syntax: statements which are not indented are executed when the program starts. Indentation is Nimrod's way of grouping statements. Indentation is diff --git a/lib/core/marshal.nim b/lib/core/marshal.nim index 303b088f8..1a06e5c37 100644 --- a/lib/core/marshal.nim +++ b/lib/core/marshal.nim @@ -12,15 +12,31 @@ import streams -proc load*[T](s: PStream, data: var T) {.magic: "Load".} +proc load*[T](s: PStream, data: var T) = ## loads `data` from the stream `s`. Raises `EIO` in case of an error. -proc store*[T](s: PStream, data: T) {.magic: "Store".} +proc store*[T](s: PStream, data: T) = ## stores `data` into the stream `s`. Raises `EIO` in case of an error. -proc reprInt(x: int64): string {.compilerproc.} = return $x -proc reprFloat(x: float): string {.compilerproc.} = return $x +type + TTypeInfo = distinct whatever + + TValue = object + t: TTypeInfo + x: pointer + + +proc rtti[T](x: T): TTypeInfo {.magic: "rtti".} + +proc `[]` (a: TValue, i: int): TValue = + ## works for arrays, objects, etc. + +proc `[]=` (a: TValue, i: int, x: TValue) = + ## + + + proc reprPointer(x: pointer): string {.compilerproc.} = var buf: array [0..59, char] diff --git a/lib/pure/os.nim b/lib/pure/os.nim index 9fafed71b..5f50578c0 100755 --- a/lib/pure/os.nim +++ b/lib/pure/os.nim @@ -284,7 +284,7 @@ proc fileNewer*(a, b: string): bool {.rtl, extern: "nos$1".} = result = getLastModificationTime(a) - getLastModificationTime(b) > 0 proc getCurrentDir*(): string {.rtl, extern: "nos$1".} = - ## Returns the current working directory. + ## Returns the `current working directory`:idx:. const bufsize = 512 # should be enough result = newString(bufsize) when defined(windows): @@ -298,7 +298,7 @@ proc getCurrentDir*(): string {.rtl, extern: "nos$1".} = OSError() proc setCurrentDir*(newDir: string) {.inline.} = - ## Sets the current working directory; `EOS` is raised if + ## Sets the `current working directory`:idx:; `EOS` is raised if ## `newDir` cannot been set. when defined(Windows): if SetCurrentDirectoryA(newDir) == 0'i32: OSError() @@ -661,7 +661,7 @@ proc executeShellCommand*(command: string): int {.deprecated.} = result = csystem(command) proc execShellCmd*(command: string): int {.rtl, extern: "nos$1".} = - ## Executes a shell command. + ## Executes a `shell command`:idx:. ## ## Command has the form 'program args' where args are the command ## line arguments given to program. The proc returns the error code @@ -720,7 +720,7 @@ proc findEnvVar(key: string): int = return -1 proc getEnv*(key: string): string = - ## Returns the value of the environment variable named `key`. + ## Returns the value of the `environment variable`:idx: named `key`. ## ## If the variable does not exist, "" is returned. To distinguish ## whether a variable exists or it's value is just "", call @@ -740,7 +740,7 @@ proc existsEnv*(key: string): bool = else: return findEnvVar(key) >= 0 proc putEnv*(key, val: string) = - ## Sets the value of the environment variable named `key` to `val`. + ## Sets the value of the `environment variable`:idx: named `key` to `val`. ## If an error occurs, `EInvalidEnvVar` is raised. # Note: by storing the string in the environment sequence, @@ -770,15 +770,17 @@ iterator iterOverEnvironment*(): tuple[key, value: string] {.deprecated.} = yield (copy(environment[i], 0, p-1), copy(environment[i], p+1)) iterator envPairs*(): tuple[key, value: string] = - ## Iterate over all environments variables. In the first component of the - ## tuple is the name of the current variable stored, in the second its value. + ## Iterate over all `environments variables`:idx:. In the first component + ## of the tuple is the name of the current variable stored, in the second + ## its value. getEnvVarsC() for i in 0..high(environment): var p = find(environment[i], '=') yield (copy(environment[i], 0, p-1), copy(environment[i], p+1)) iterator walkFiles*(pattern: string): string = - ## Iterate over all the files that match the `pattern`. + ## Iterate over all the files that match the `pattern`. On POSIX this uses + ## the `glob`:idx: call. ## ## `pattern` is OS dependant, but at least the "\*.ext" ## notation is supported. @@ -914,7 +916,7 @@ proc rawCreateDir(dir: string) = OSError() proc createDir*(dir: string) {.rtl, extern: "nos$1".} = - ## Creates the directory `dir`. + ## Creates the `directory`:idx: `dir`. ## ## The directory may contain several subdirectories that do not exist yet. ## The full path is created. If this fails, `EOS` is raised. It does **not** @@ -1122,13 +1124,13 @@ when defined(windows): ownArgv: seq[string] proc paramCount*(): int {.rtl, extern: "nos$1".} = - ## Returns the number of command line arguments given to the + ## Returns the number of `command line arguments`:idx: given to the ## application. if isNil(ownArgv): ownArgv = parseCmdLine($getCommandLineA()) result = ownArgv.len-1 proc paramStr*(i: int): string {.rtl, extern: "nos$1".} = - ## Returns the `i`-th command line argument given to the + ## Returns the `i`-th `command line argument`:idx: given to the ## application. ## ## `i` should be in the range `1..paramCount()`, else diff --git a/lib/pure/strutils.nim b/lib/pure/strutils.nim index 6a7f128c5..d7b457263 100755 --- a/lib/pure/strutils.nim +++ b/lib/pure/strutils.nim @@ -205,6 +205,7 @@ proc `%` *(formatstr: string, a: openarray[string]): string {.noSideEffect, ## ## The substitution variables (the thing after the ``$``) are enumerated ## from 1 to ``a.len``. + ## To produce a verbatim ``$``, use ``$$``. ## The notation ``$#`` can be used to refer to the next substitution variable: ## ## .. code-block:: nimrod diff --git a/rod/docgen.nim b/rod/docgen.nim index 04330bb41..73566dbb0 100755 --- a/rod/docgen.nim +++ b/rod/docgen.nim @@ -254,7 +254,7 @@ proc setIndexForSourceTerm(d: PDoc, name: PRstNode, id: int) = proc renderIndexTerm(d: PDoc, n: PRstNode): PRope = inc(d.id) - result = dispF("<em id=\"$1\">$2</em>", "$2\\label{$1}", + result = dispF("<span id=\"$1\">$2</span>", "$2\\label{$1}", [toRope(d.id), renderAux(d, n)]) var h = newRstNode(rnHyperlink) var a = newRstNode(rnLeaf, d.indexValFilename & disp("#", "") & $d.id) @@ -739,7 +739,7 @@ proc renderRstToOut(d: PDoc, n: PRstNode): PRope = result = renderAux(d, n, disp("<cite>$1</cite>", "\\emph{$1}")) of rnIdx: if d.theIndex == nil: - result = renderAux(d, n, disp("<em>$1</em>", "\\emph{$1}")) + result = renderAux(d, n, disp("<span>$1</span>", "\\emph{$1}")) else: result = renderIndexTerm(d, n) of rnInlineLiteral: diff --git a/todo.txt b/todo.txt index 73f598fd9..d051a3d81 100755 --- a/todo.txt +++ b/todo.txt @@ -1,6 +1,7 @@ - thread support: threadvar on Windows seems broken; add --deadlock_prevention:on|off switch - built-in serialization +- change how generalized raw string literals work - we need a way to disable tests - deprecate ^ and make it available as operator |