diff options
author | Lynn C. Rees <lcrees@gmail.com> | 2017-11-15 13:58:11 -0700 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2017-11-15 21:58:11 +0100 |
commit | ac5dff2e04f4f8e2c4aa6537e89d26c2ca09b946 (patch) | |
tree | 1ce0f9f39d2e50009881bbc8e0f8ffc88359e8cb /examples | |
parent | 5e66a7ce591f8abf2cddeffe8389c53a3183c2a8 (diff) | |
download | Nim-ac5dff2e04f4f8e2c4aa6537e89d26c2ca09b946.tar.gz |
Change expr/stmt in examples to untyped (#6734)
Diffstat (limited to 'examples')
-rw-r--r-- | examples/cross_calculator/ios/resources/ui/NRViewController.xib | 2 | ||||
-rw-r--r-- | examples/cross_calculator/lazarus/unit1.pas | 2 | ||||
-rw-r--r-- | examples/cross_calculator/nim_commandline/nim.cfg | 2 | ||||
-rw-r--r-- | examples/cross_calculator/readme.txt | 2 | ||||
-rw-r--r-- | examples/cross_todo/nim_backend/backend.nim | 66 | ||||
-rw-r--r-- | examples/cross_todo/nim_backend/testbackend.nim | 13 | ||||
-rw-r--r-- | examples/cross_todo/nim_commandline/nim.cfg | 2 | ||||
-rw-r--r-- | examples/cross_todo/nim_commandline/nimtodo.nim | 56 | ||||
-rw-r--r-- | examples/cross_todo/nim_commandline/readme.txt | 2 | ||||
-rw-r--r-- | examples/cross_todo/readme.txt | 2 | ||||
-rw-r--r-- | examples/keyval.nim | 3 | ||||
-rw-r--r-- | examples/readme.txt | 2 | ||||
-rw-r--r-- | examples/talk/dsl.nim | 10 | ||||
-rw-r--r-- | examples/talk/formatoptimizer.nim | 6 | ||||
-rw-r--r-- | examples/talk/quasiquote.nim | 2 | ||||
-rw-r--r-- | examples/talk/tags.nim | 3 |
16 files changed, 56 insertions, 119 deletions
diff --git a/examples/cross_calculator/ios/resources/ui/NRViewController.xib b/examples/cross_calculator/ios/resources/ui/NRViewController.xib index b260db2af..2118b5044 100644 --- a/examples/cross_calculator/ios/resources/ui/NRViewController.xib +++ b/examples/cross_calculator/ios/resources/ui/NRViewController.xib @@ -85,7 +85,7 @@ <int key="IBUITag">2</int> <bool key="IBUIUserInteractionEnabled">NO</bool> <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string> - <string key="IBUIText">Nimrod Crossplatform Calculator</string> + <string key="IBUIText">Nim Crossplatform Calculator</string> <object class="NSColor" key="IBUITextColor" id="128895179"> <int key="NSColorSpace">1</int> <bytes key="NSRGB">MCAwIDAAA</bytes> diff --git a/examples/cross_calculator/lazarus/unit1.pas b/examples/cross_calculator/lazarus/unit1.pas index aa0ef6cf7..6091a61d3 100644 --- a/examples/cross_calculator/lazarus/unit1.pas +++ b/examples/cross_calculator/lazarus/unit1.pas @@ -42,7 +42,7 @@ function myAdd(x, y: longint): longint; cdecl; external; procedure TForm1.FormCreate(Sender: TObject); begin - // we initialize the Nimrod data structures here: + // we initialize the Nim data structures here: NimMain(); end; diff --git a/examples/cross_calculator/nim_commandline/nim.cfg b/examples/cross_calculator/nim_commandline/nim.cfg index 41c034430..6f0cb4a01 100644 --- a/examples/cross_calculator/nim_commandline/nim.cfg +++ b/examples/cross_calculator/nim_commandline/nim.cfg @@ -1,4 +1,4 @@ -# Nimrod configuration file. +# Nim configuration file. # The file is used only to add the path of the backend to the compiler options. path="../nim_backend" diff --git a/examples/cross_calculator/readme.txt b/examples/cross_calculator/readme.txt index 5011792b9..72e4130eb 100644 --- a/examples/cross_calculator/readme.txt +++ b/examples/cross_calculator/readme.txt @@ -2,7 +2,7 @@ The cross platform calculator illustrates how to use Nim to create a backend called by different native user interfaces. Since the purpose of the example is to show how the cross platform code -interacts with Nimrod the actual backend code is just a simple addition proc. +interacts with Nim the actual backend code is just a simple addition proc. By keeping your program logic in Nim you can easily reuse it in different platforms. diff --git a/examples/cross_todo/nim_backend/backend.nim b/examples/cross_todo/nim_backend/backend.nim index 6869665f8..513fe304f 100644 --- a/examples/cross_todo/nim_backend/backend.nim +++ b/examples/cross_todo/nim_backend/backend.nim @@ -4,9 +4,8 @@ import db_sqlite, parseutils, strutils, times - type - TTodo* = object + Todo* = object ## A todo object holding the information serialized to the database. id: int64 ## Unique identifier of the object in the ## database, use the getId() accessor to read it. @@ -17,7 +16,7 @@ type ## outside of this module, use the ## getModificationDate accessor. - TPagedParams* = object + PagedParams* = object ## Contains parameters for a query, initialize default values with ## initDefaults(). pageSize*: int64 ## Lines per returned query page, -1 for @@ -27,11 +26,10 @@ type showUnchecked*: bool ## Get unchecked objects. showChecked*: bool ## Get checked objects. - # - General procs -# -proc initDefaults*(params: var TPagedParams) = - ## Sets sane defaults for a TPagedParams object. + +proc initDefaults*(params: var PagedParams) = + ## Sets sane defaults for a PagedParams object. ## ## Note that you should always provide a non zero pageSize, either a specific ## positive value or negative for unbounded query results. @@ -41,7 +39,6 @@ proc initDefaults*(params: var TPagedParams) = params.showUnchecked = true params.showChecked = false - proc openDatabase*(path: string): DbConn = ## Creates or opens the sqlite3 database. ## @@ -56,16 +53,14 @@ proc openDatabase*(path: string): DbConn = desc TEXT NOT NULL, modification_date INTEGER NOT NULL, CONSTRAINT Todos UNIQUE (id))""" - db_sqlite.exec(conn, query) result = conn +# - Procs related to Todo objects -# - Procs related to TTodo objects -# proc initFromDB(id: int64; text: string; priority: int, isDone: bool; - modificationDate: Time): TTodo = - ## Returns an initialized TTodo object created from database parameters. + modificationDate: Time): Todo = + ## Returns an initialized Todo object created from database parameters. ## ## The proc assumes all values are right. Note this proc is NOT exported. assert(id >= 0, "Identity identifiers should not be negative") @@ -75,29 +70,25 @@ proc initFromDB(id: int64; text: string; priority: int, isDone: bool; result.isDone = isDone result.modificationDate = modificationDate - -proc getId*(todo: TTodo): int64 = +proc getId*(todo: Todo): int64 = ## Accessor returning the value of the private id property. return todo.id - -proc getModificationDate*(todo: TTodo): Time = - ## Returns the last modification date of a TTodo entry. +proc getModificationDate*(todo: Todo): Time = + ## Returns the last modification date of a Todo entry. return todo.modificationDate - -proc update*(todo: var TTodo; conn: DbConn): bool = +proc update*(todo: var Todo; conn: DbConn): bool = ## Checks the database for the object and refreshes its variables. ## ## Use this method if you (or another entity) have modified the database and ## want to update the object you have with whatever the database has stored. ## Returns true if the update succeeded, or false if the object was not found ## in the database any more, in which case you should probably get rid of the - ## TTodo object. + ## Todo object. assert(todo.id >= 0, "The identifier of the todo entry can't be negative") let query = sql"""SELECT desc, priority, is_done, modification_date FROM Todos WHERE id = ?""" - try: let rows = conn.getAllRows(query, $todo.id) if len(rows) < 1: @@ -111,8 +102,7 @@ proc update*(todo: var TTodo; conn: DbConn): bool = except: echo("Something went wrong selecting for id " & $todo.id) - -proc save*(todo: var TTodo; conn: DbConn): bool = +proc save*(todo: var Todo; conn: DbConn): bool = ## Saves the current state of text, priority and isDone to the database. ## ## Returns true if the database object was updated (in which case the @@ -127,15 +117,13 @@ proc save*(todo: var TTodo; conn: DbConn): bool = WHERE id = ?""" rowsUpdated = conn.execAffectedRows(query, $todo.text, $todo.priority, $todo.isDone, $int(currentDate), $todo.id) - if 1 == rowsUpdated: todo.modificationDate = currentDate result = true - # - Procs dealing directly with the database -# -proc addTodo*(conn: DbConn; priority: int; text: string): TTodo = + +proc addTodo*(conn: DbConn; priority: int; text: string): Todo = ## Inserts a new todo into the database. ## ## Returns the generated todo object. If there is an error EDb will be raised. @@ -145,10 +133,8 @@ proc addTodo*(conn: DbConn; priority: int; text: string): TTodo = (priority, is_done, desc, modification_date) VALUES (?, 'false', ?, ?)""" todoId = conn.insertId(query, priority, text, $int(currentDate)) - result = initFromDB(todoId, text, priority, false, currentDate) - proc deleteTodo*(conn: DbConn; todoId: int64): int64 {.discardable.} = ## Deletes the specified todo identifier. ## @@ -156,7 +142,6 @@ proc deleteTodo*(conn: DbConn; todoId: int64): int64 {.discardable.} = let query = sql"""DELETE FROM Todos WHERE id = ?""" result = conn.execAffectedRows(query, $todoId) - proc getNumEntries*(conn: DbConn): int = ## Returns the number of entries in the Todos table. ## @@ -170,38 +155,30 @@ proc getNumEntries*(conn: DbConn): int = echo("Something went wrong retrieving number of Todos entries") result = -1 - -proc getPagedTodos*(conn: DbConn; params: TPagedParams; - page = 0'i64): seq[TTodo] = +proc getPagedTodos*(conn: DbConn; params: PagedParams; page = 0'i64): seq[Todo] = ## Returns the todo entries for a specific page. ## ## Pages are calculated based on the params.pageSize parameter, which can be ## set to a negative value to specify no limit at all. The query will be - ## affected by the TPagedParams, which should have sane values (call + ## affected by the PagedParams, which should have sane values (call ## initDefaults). assert(page >= 0, "You should request a page zero or bigger than zero") result = @[] - # Well, if you don't want to see anything, there's no point in asking the db. if not params.showUnchecked and not params.showChecked: return - let order_by = [ if params.priorityAscending: "ASC" else: "DESC", if params.dateAscending: "ASC" else: "DESC"] - query = sql("""SELECT id, desc, priority, is_done, modification_date FROM Todos WHERE is_done = ? OR is_done = ? ORDER BY priority $1, modification_date $2, id DESC LIMIT ? * ?,?""" % order_by) - args = @[$params.showChecked, $(not params.showUnchecked), $params.pageSize, $page, $params.pageSize] - #echo("Query " & string(query)) #echo("args: " & args.join(", ")) - var newId: BiggestInt for row in conn.fastRows(query, args): let numChars = row[0].parseBiggestInt(newId) @@ -209,10 +186,9 @@ proc getPagedTodos*(conn: DbConn; params: TPagedParams; result.add(initFromDB(int64(newId), row[1], row[2].parseInt, row[3].parseBool, Time(row[4].parseInt))) - -proc getTodo*(conn: DbConn; todoId: int64): ref TTodo = - ## Returns a reference to a TTodo or nil if the todo could not be found. - var tempTodo: TTodo +proc getTodo*(conn: DbConn; todoId: int64): ref Todo = + ## Returns a reference to a Todo or nil if the todo could not be found. + var tempTodo: Todo tempTodo.id = todoId if tempTodo.update(conn): new(result) diff --git a/examples/cross_todo/nim_backend/testbackend.nim b/examples/cross_todo/nim_backend/testbackend.nim index 6754f013a..4a71d5f2c 100644 --- a/examples/cross_todo/nim_backend/testbackend.nim +++ b/examples/cross_todo/nim_backend/testbackend.nim @@ -2,8 +2,7 @@ import backend, db_sqlite, strutils, times - -proc showPagedResults(conn: DbConn; params: TPagedParams) = +proc showPagedResults(conn: DbConn; params: PagedParams) = ## Shows the contents of the database in pages of specified size. ## ## Hmm... I guess this is more of a debug proc which should be moved outside, @@ -11,7 +10,6 @@ proc showPagedResults(conn: DbConn; params: TPagedParams) = var page = 0'i64 rows = conn.getPagedTodos(params) - while rows.len > 0: echo("page " & $page) for row in rows: @@ -25,7 +23,6 @@ proc showPagedResults(conn: DbConn; params: TPagedParams) = else: break - proc dumTest() = let conn = openDatabase("todo.sqlite3") try: @@ -35,10 +32,8 @@ proc dumTest() = # Fill some dummy rows if there are not many entries yet. discard conn.addTodo(3, "Filler1") discard conn.addTodo(4, "Filler2") - var todo = conn.addTodo(2, "Testing") echo("New todo added with id " & $todo.getId) - # Try changing it and updating the database. var clonedTodo = conn.getTodo(todo.getId)[] assert(clonedTodo.text == todo.text, "Should be equal") @@ -49,13 +44,11 @@ proc dumTest() = echo("Updated priority $1, done $2" % [$todo.priority, $todo.isDone]) else: assert(false, "Uh oh, I wasn't expecting that!") - # Verify our cloned copy is different but can be updated. assert(clonedTodo.text != todo.text, "Should be different") discard clonedTodo.update(conn) assert(clonedTodo.text == todo.text, "Should be equal") - - var params: TPagedParams + var params: PagedParams params.initDefaults conn.showPagedResults(params) conn.deleteTodo(todo.getId) @@ -66,7 +59,6 @@ proc dumTest() = echo("Later priority $1, done $2" % [$todo.priority, $todo.isDone]) else: echo("Can't update object $1 from db!" % $todo.getId) - # Try to list content in a different way. params.pageSize = 5 params.priorityAscending = true @@ -77,7 +69,6 @@ proc dumTest() = conn.close echo("Database closed") - # Code that will be run only on the commandline. when isMainModule: dumTest() diff --git a/examples/cross_todo/nim_commandline/nim.cfg b/examples/cross_todo/nim_commandline/nim.cfg index 41c034430..6f0cb4a01 100644 --- a/examples/cross_todo/nim_commandline/nim.cfg +++ b/examples/cross_todo/nim_commandline/nim.cfg @@ -1,4 +1,4 @@ -# Nimrod configuration file. +# Nim configuration file. # The file is used only to add the path of the backend to the compiler options. path="../nim_backend" diff --git a/examples/cross_todo/nim_commandline/nimtodo.nim b/examples/cross_todo/nim_commandline/nimtodo.nim index c8993b2c8..be5b3407b 100644 --- a/examples/cross_todo/nim_commandline/nimtodo.nim +++ b/examples/cross_todo/nim_commandline/nimtodo.nim @@ -18,8 +18,8 @@ Commands: -h, --help shows this help List options (optional): - -p=+|- Sorts list by ascending|desdencing priority. Default:desdencing. - -m=+|- Sorts list by ascending|desdencing date. Default:desdencing. + -p=+|- Sorts list by ascending|descending priority. Default:descending. + -m=+|- Sorts list by ascending|descending date. Default:descending. -t Show checked entries. By default they are not shown. -z Hide unchecked entries. By default they are shown. @@ -33,7 +33,7 @@ Examples: """ type - TCommand = enum # The possible types of commands + Command = enum # The possible types of commands cmdAdd # The user wants to add a new todo entry. cmdCheck # User wants to check a todo entry. cmdUncheck # User wants to uncheck a todo entry. @@ -42,30 +42,27 @@ type cmdGenerate # Add random rows to the database, for testing. cmdList # User wants to list contents. - TParamConfig = object + ParamConfig = object # Structure containing the parsed options from the commandline. - command: TCommand # Store the type of operation + command: Command # Store the type of operation addPriority: int # Only valid with cmdAdd, stores priority. addText: seq[string] # Only valid with cmdAdd, stores todo text. todoId: int64 # The todo id for operations like check or delete. - listParams: TPagedParams # Uses the backend structure directly for params. + listParams: PagedParams # Uses the backend structure directly for params. - -proc initDefaults(params: var TParamConfig) = +proc initDefaults(params: var ParamConfig) = ## Initialises defaults value in the structure. ## ## Most importantly we want to have an empty list for addText. params.listParams.initDefaults params.addText = @[] - proc abort(message: string, value: int) = # Simple wrapper to abort also displaying the help to the user. stdout.write(USAGE) quit(message, value) - -template parseTodoIdAndSetCommand(newCommand: TCommand): stmt = +template parseTodoIdAndSetCommand(newCommand: Command): untyped = ## Helper to parse a big todo identifier into todoId and set command. try: let numChars = val.parseBiggestInt(newId) @@ -75,8 +72,7 @@ template parseTodoIdAndSetCommand(newCommand: TCommand): stmt = except OverflowError: raise newException(ValueError, "Value $1 too big" % val) - -template verifySingleCommand(actions: stmt): stmt = +template verifySingleCommand(actions: typed): typed = ## Helper to make sure only one command has been specified so far. if specifiedCommand: abort("Only one command can be specified at a time! (extra:$1)" % [key], 2) @@ -84,7 +80,6 @@ template verifySingleCommand(actions: stmt): stmt = actions specifiedCommand = true - proc parsePlusMinus(val: string, debugText: string): bool = ## Helper to process a plus or minus character from the commandline. ## @@ -100,11 +95,10 @@ proc parsePlusMinus(val: string, debugText: string): bool = else: abort("$1 parameter should be + or - but was '$2'." % [debugText, val], 4) - -proc parseCmdLine(): TParamConfig = +proc parseCmdLine(): ParamConfig = ## Parses the commandline. ## - ## Returns a TParamConfig structure filled with the proper values or directly + ## Returns a ParamConfig structure filled with the proper values or directly ## calls quit() with the appropriate error message. var specifiedCommand = false @@ -112,15 +106,12 @@ proc parseCmdLine(): TParamConfig = p = initOptParser() key, val: TaintedString newId: BiggestInt - result.initDefaults - try: while true: next(p) key = p.key val = p.val - case p.kind of cmdArgument: if specifiedCommand and cmdAdd == result.command: @@ -180,17 +171,13 @@ proc parseCmdLine(): TParamConfig = break except ValueError: abort("Invalid integer value '$1' for parameter '$2'." % [val, key], 7) - if not specifiedCommand: abort("Didn't specify any command.", 8) - if cmdAdd == result.command and result.addText.len < 1: abort("Used the add command, but provided no text/description.", 9) - if usesListParams and cmdList != result.command: abort("Used list options, but didn't specify the list command.", 10) - proc generateDatabaseRows(conn: DbConn) = ## Adds some rows to the database ignoring errors. discard conn.addTodo(1, "Watch another random youtube video") @@ -208,19 +195,16 @@ proc generateDatabaseRows(conn: DbConn) = discard conn.addTodo(6, "Learn a functional programming language") echo("Generated some entries, they were added to your database.") - -proc listDatabaseContents(conn: DbConn; listParams: TPagedParams) = +proc listDatabaseContents(conn: DbConn; listParams: PagedParams) = ## Dumps the database contents formatted to the standard output. ## ## Pass the list/filter parameters parsed from the commandline. var params = listParams params.pageSize = -1 - let todos = conn.getPagedTodos(params) if todos.len < 1: echo("Database empty") return - echo("Todo id, is done, priority, last modification date, text:") # First detect how long should be our columns for formatting. var cols: array[0..2, int] @@ -228,7 +212,6 @@ proc listDatabaseContents(conn: DbConn; listParams: TPagedParams) = cols[0] = max(cols[0], ($todo.getId).len) cols[1] = max(cols[1], ($todo.priority).len) cols[2] = max(cols[2], ($todo.getModificationDate).len) - # Now dump all the rows using the calculated alignment sizes. for todo in todos: echo("$1 $2 $3, $4, $5" % [ @@ -238,7 +221,6 @@ proc listDatabaseContents(conn: DbConn; listParams: TPagedParams) = ($todo.getModificationDate).align(cols[2]), todo.text]) - proc deleteOneTodo(conn: DbConn; todoId: int64) = ## Deletes a single todo entry from the database. let numDeleted = conn.deleteTodo(todoId) @@ -247,7 +229,6 @@ proc deleteOneTodo(conn: DbConn; todoId: int64) = else: quit("Couldn't delete todo id " & $todoId, 11) - proc deleteAllTodos(conn: DbConn) = ## Deletes all the contents from the database. ## @@ -256,43 +237,35 @@ proc deleteAllTodos(conn: DbConn) = ## ourselfves to the API exported by backend. var counter: int64 - params: TPagedParams - + params: PagedParams params.initDefaults params.pageSize = -1 params.showUnchecked = true params.showChecked = true - let todos = conn.getPagedTodos(params) for todo in todos: if conn.deleteTodo(todo.getId) > 0: counter += 1 else: quit("Couldn't delete todo id " & $todo.getId, 12) - echo("Deleted $1 todo entries from database." % $counter) - proc setTodoCheck(conn: DbConn; todoId: int64; value: bool) = ## Changes the check state of a todo entry to the specified value. let newState = if value: "checked" else: "unchecked" todo = conn.getTodo(todoId) - if todo == nil: quit("Can't modify todo id $1, its not in the database." % $todoId, 13) - if todo[].isDone == value: echo("Todo id $1 was already set to $2." % [$todoId, newState]) return - todo[].isDone = value if todo[].save(conn): echo("Todo id $1 set to $2." % [$todoId, newState]) else: quit("Error updating todo id $1 to $2." % [$todoId, newState]) - proc addTodo(conn: DbConn; priority: int; tokens: seq[string]) = ## Adds to the database a todo with the specified priority. ## @@ -302,17 +275,14 @@ proc addTodo(conn: DbConn; priority: int; tokens: seq[string]) = echo("Created todo entry with id:$1 for priority $2 and text '$3'." % [ $todo.getId, $todo.priority, todo.text]) - when isMainModule: ## Main entry point. let opt = parseCmdLine() dbPath = getConfigDir() / "nimtodo.sqlite3" - if not dbPath.existsFile: createDir(getConfigDir()) echo("No database found at $1, it will be created for you." % dbPath) - let conn = openDatabase(dbPath) try: case opt.command diff --git a/examples/cross_todo/nim_commandline/readme.txt b/examples/cross_todo/nim_commandline/readme.txt index ca4b67521..7d68bbc8b 100644 --- a/examples/cross_todo/nim_commandline/readme.txt +++ b/examples/cross_todo/nim_commandline/readme.txt @@ -14,6 +14,6 @@ generation switch can be used to fill the database with some basic todo entries you can play with. Compilation is fairly easy despite having the source split in different -directories. Thanks to the Nim.cfg file, which adds the ../Nim_backend +directories. Thanks to the nim.cfg file, which adds the ../Nim_backend directory as a search path, you can compile and run the example just fine from the command line with 'nim c -r nimtodo.nim'. diff --git a/examples/cross_todo/readme.txt b/examples/cross_todo/readme.txt index 5be01e197..44e8c47aa 100644 --- a/examples/cross_todo/readme.txt +++ b/examples/cross_todo/readme.txt @@ -1,4 +1,4 @@ -The cross platform todo illustrates how to use Nim to create a backend +This cross platform todo illustrates how to use Nim to create a backend called by different native user interfaces. This example builds on the knowledge learned from the cross_calculator example. diff --git a/examples/keyval.nim b/examples/keyval.nim index ae8cb8f08..a594c0fa8 100644 --- a/examples/keyval.nim +++ b/examples/keyval.nim @@ -3,7 +3,6 @@ import re for x in lines("myfile.txt"): if x =~ re"(\w+)=(.*)": - echo "Key: ", matches[0], - " Value: ", matches[1] + echo "Key: ", matches[0], " Value: ", matches[1] diff --git a/examples/readme.txt b/examples/readme.txt index dc3d3fb9b..176bc8239 100644 --- a/examples/readme.txt +++ b/examples/readme.txt @@ -1,4 +1,4 @@ -In this directory you will find several examples for how to use the Nimrod +In this directory you will find several examples for how to use the Nim library. Copyright (c) 2004-2012 Andreas Rumpf. diff --git a/examples/talk/dsl.nim b/examples/talk/dsl.nim index 1034c99d4..2dde51790 100644 --- a/examples/talk/dsl.nim +++ b/examples/talk/dsl.nim @@ -1,20 +1,20 @@ import strutils -template html(name: expr, matter: stmt) {.immediate.} = +template html(name, matter: untyped) = proc name(): string = result = "<html>" matter result.add("</html>") -template nestedTag(tag: expr) {.immediate.} = - template tag(matter: stmt) {.immediate.} = +template nestedTag(tag: untyped) = + template tag(matter: typed) = result.add("<" & astToStr(tag) & ">") matter result.add("</" & astToStr(tag) & ">") -template simpleTag(tag: expr) {.immediate.} = - template tag(matter: expr) {.immediate.} = +template simpleTag(tag: untyped) = + template tag(matter: untyped) = result.add("<$1>$2</$1>" % [astToStr(tag), matter]) nestedTag body diff --git a/examples/talk/formatoptimizer.nim b/examples/talk/formatoptimizer.nim index db11d112d..104214e19 100644 --- a/examples/talk/formatoptimizer.nim +++ b/examples/talk/formatoptimizer.nim @@ -5,7 +5,7 @@ import macros proc invalidFormatString() = echo "invalidFormatString" -template formatImpl(handleChar: expr) = +template formatImpl(handleChar: untyped) = var i = 0 while i < f.len: if f[i] == '$': @@ -24,11 +24,11 @@ template formatImpl(handleChar: expr) = i += 1 proc `%`*(f: string, a: openArray[string]): string = - template identity(x: expr): expr = x + template identity(x: untyped): untyped = x result = "" formatImpl(identity) -macro optFormat{`%`(f, a)}(f: string{lit}, a: openArray[string]): expr = +macro optFormat{`%`(f, a)}(f: string{lit}, a: openArray[string]): untyped = result = newNimNode(nnkBracket) #newCall("&") let f = f.strVal diff --git a/examples/talk/quasiquote.nim b/examples/talk/quasiquote.nim index df4003e6e..b3c7bb971 100644 --- a/examples/talk/quasiquote.nim +++ b/examples/talk/quasiquote.nim @@ -1,7 +1,7 @@ import macros -macro check(ex: expr): stmt = +macro check(ex: untyped): typed = var info = ex.lineinfo var expString = ex.toStrLit result = quote do: diff --git a/examples/talk/tags.nim b/examples/talk/tags.nim index 12b9a08c3..8bf3450c9 100644 --- a/examples/talk/tags.nim +++ b/examples/talk/tags.nim @@ -1,8 +1,9 @@ -template htmlTag(tag: expr) {.immediate.} = +template htmlTag(tag: untyped) = proc tag(): string = "<" & astToStr(tag) & ">" htmlTag(br) htmlTag(html) echo br() +echo html() \ No newline at end of file |