Heres the description from the website:
Quote
Nimrod is a new statically typed, imperative programming language, that supports procedural, object oriented, functional and generic programming styles while remaining simple and efficient. A special feature that Nimrod inherited from Lisp is that Nimrod's abstract syntax tree (AST) is part of the specification - this allows a powerful macro system which allows domain specific languages.
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
Nimrod is expressive
Nimrod is elegant
Nimrod plays nice with others
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[1] == "PRIVMSG":
var channel : string
var nick : string
var msg : string
channel = data[2]
nick = data[0]
nick.delete(0,0)
nick.delete(nick.find("!") + 1,len(nick))
msg = Substring(line,line.find(data[3]))
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[0],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

New Topic/Question
Reply



MultiQuote





|