Wren.NET is a small scripting language written in C#, based on https://github.com/munificent/wren
The following example shows the syntax accepted
// This file provides examples of syntactic constructs in wren, which is mainly
// interesting for testing syntax highlighters.
// This is a comment.
/* This is /* a nested */ comment. */
// Class definition with a toplevel name.
class SyntaxExample {
// Constructor
construct new() {
// Top-level name `IO`
IO.print("I am a constructor!")
// Method calls
variables
fields()
// Block arguments
fields { block }
fields {|a, b| block }
fields(argument) { block }
fields(argument) {|a, b| block }
// Static method call
SyntaxExample.fields(1)
}
// Constructor with arguments
construct constructor(a, b) {
print(a, b)
field = a
}
// Method without arguments
variables {
// Valid local variable names.
var hi
var camelCase
var PascalCase
var abc123
var ALL_CAPS
}
// Method with empty argument list
fields() {
// Fields
_under_score = 1
_field = 2
}
// Static method with single argument
static fields(a) {
// Static field
__a = a
}
// Setter
field=(value) { _field = value }
// Method with arguments
print(a, b) { IO.print(a + b) }
// Operators
+(other) { "infix + " + other }
-(other) { "infix - " + other }
*(other) { "infix * " + other }
/(other) { "infix / " + other }
%(other) { "infix % " + other }
<(other) { "infix < " + other }
>(other) { "infix > " + other }
<=(other) { "infix <= " + other }
>=(other) { "infix >= " + other }
==(other) { "infix == " + other }
!=(other) { "infix != " + other }
&(other) { "infix & " + other }
|(other) { "infix | " + other }
! { "prefix !" }
~ { "prefix ~" }
- { "prefix -" }
}
// `class`, `is`
class ReservedWords is SyntaxExample {
reserved {
// `super`, `true`, `false`
super(true, false)
// `this`
this.foo
}
foo {
// `var`
var n = 27
// `while`, `if`, `else`
while (n != 1) if (n % 2 == 0) n = n / 2 else n = 3 * n + 1
// `for`, `in`
for (beatle in ["george", "john", "paul", "ringo"]) {
IO.print(beatle)
// `break`
break
}
// `return`, `null`
return null
}
imports {
// `import`
import "hello"
// `import`, `for`
import "set" for Set
}
// `foreign`, `static`
// foreign static bar
// foreign baz(string)
// (Remove lines above to make this file compile)
}
class Literals is SyntaxExample {
booleans { true || false }
numbers {
0
1234
-5678
3.14159
1.0
-12.34
0xdeadbeef
0x1234567890ABCDEF
}
strings {
"hi there"
// Escapes:
"\0" // The NUL byte: 0.
"\"" // A double quote character.
"\\" // A backslash.
"\a" // Alarm beep. (Who uses this?)
"\b" // Backspace.
"\f" // Formfeed.
"\n" // Newline.
"\r" // Carriage return.
"\t" // Tab.
"\v" // Vertical tab.
// Unicode code points
IO.print("\u0041fgdg\u0b83\u00DE") // "AஃÞ"
// Unencoded bytes
IO.print("\x48\x69\x2e") // "Hi."
}
ranges {
3..8 // inclusive
4...6 // half-inclusive
}
nothing { null }
lists {
var list = [1, "banana", true]
list[0] = 5
list[1..2]
}
maps {
var stringMap = {
"George": "Harrison",
"John": "Lennon",
"Paul": "McCartney",
"Ringo": "Starr"
}
var a = 1
var weirdMap = {
true: 1,
false: 0,
null: -1,
"str": "abc",
(1..5): 10,
a: 2,
_a: 3,
__a: 4
}
}
}
To get started, just clone the repository and build. There are no external dependencies.