Heres the description from the website:
Nimrod is a compiled, garbage-collected systems programming language which has an excellent productivity/performance ratio. Nimrod's design focuses on the 3E: efficiency, expressiveness, elegance (in the order of priority).
Nimrod is efficient
- Native code generation (currently via compilation to C), not dependant on a virtual machine: Nimrod produces small executables without dependencies for easy redistribution.
- A fast non-recursive incremental and generational garbage collector that should be well suited for soft real-time systems (like games).
- System programming features: Ability to manage your own memory and access the hardware directly. Pointers to garbage collected memory are distinguished from pointers to manually managed memory.
- Zero-overhead iterators.
- Cross-module inlining.
- Dynamic method binding with inlining and without virtual method table.
- Compile time evaluation of user-defined functions.
- Whole program dead code elimination: Only used functions are included in the executable.
- Value-based datatypes: For instance, objects and arrays can be allocated on the stack.
Nimrod is expressive
- The Nimrod compiler and all of the standard library are implemented in Nimrod.
- Built-in high level datatypes: strings, sets, sequences, etc.
- Modern type system with local type inference, tuples, variants, generics, etc.
- User-defineable operators; code with new operators is often easier to read than code which overloads built-in operators. In the code snippet, the =~ operator is defined in the re module.
- Macros can modify the abstract syntax tree at compile time.
Nimrod is elegant
- Macros can use the imperative paradigm to construct parse trees. Nimrod does not require a different coding style for meta programming.
- Macros cannot change Nimrod's syntax because there is no need for it.
- Nimrod's syntax is flexible enough.
- Statements are grouped by indentation but can span multiple lines.
- Indentation must not contain tabulators so the compiler always sees the code the same way as you do.
Nimrod plays nice with others
- The Nimrod Compiler runs on Windows, Linux, BSD and Mac OS X. Porting to other platforms is easy.
- There are bindings to GTK2, the Windows API, the POSIX API, OpenGL, SDL, Cario, Python, Lua, TCL, X11, libzip, PRCE, ODBC, libcurl, mySQL and SQLite.
- A C to Nimrod conversion utility: New bindings to C libraries are easily generated by c2nim.
- A Pascal to Nimrod conversion utility: A large subset of Object Pascal can be translated to Nimrod automatically!
Here is a simple irc bot I wrote in Nimrod a few months ago:
import sockets import strutils import re import httpclient var tcp : TSocket tcp = socket() connect(tcp ,"irc.freenode.net" ,TPort(6667),TDomain.AF_INET) proc Join (chan : string) = send(tcp,"JOIN " & chan & "\r\n") proc Part (chan : string) = send(tcp,"PART " & chan & "\r\n") proc Logon(nick : string) = send(tcp,"USER " & nick & " " & nick & " " & nick & " " & nick &"\r\n") send(tcp,"NICK " & nick & "\r\n") proc SendText(msg : string, chan : string) = send(tcp, "PRIVMSG " & chan & " :" & msg & "\r\n") proc Substring(str : string, strt : int) : string = var strng : string strng = str strng.delete(0,strt) return strng var info_sent : bool info_sent = false if info_sent == false: Logon("Nimbot") Join("#()") info_sent = true while true: var line : string line = tcp.recv() var data : seq[string] data = split(line) if line != nil and line != "": echo(line) if startsWith(line,"PING :"): var l2 : string l2 = line.replace("PING :","PONG :") send(tcp,l2) Echo(l2) if data == "PRIVMSG": var channel : string var nick : string var msg : string channel = data nick = data nick.delete(0,0) nick.delete(nick.find("!") + 1,len(nick)) msg = Substring(line,line.find(data)) if msg.startsWith("*"): msg = Substring(msg,0) if msg.toLower.startsWith("say"): msg = Substring(msg,3) SendText(msg,channel) elif msg.toLower.startsWith("ping"): SendText("pong",channel) elif msg.toLower.startsWith("join"): msg = Substring(msg,4) Join(msg) elif msg.toLower.startsWith("part"): msg = Substring(msg,4) Part(msg) elif msg.toLower.startsWith("title"): SendText("Feature disabled.",channel) #var url : string #url = Substring(msg,5) #Echo(url) #if url.startsWith("http://"): # url = Substring(url,6) # Echo(url) #url = replace(url,"\c\L","") #var html : string = getContent(url) #echo(html) #if html =~ re"<title>.*?</title>": # SendText(matches,channel)
Nimrod is available on Github here and from the website here.
This post has been edited by Amrykid: 09 January 2011 - 08:59 AM