Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/fjolnir/Tranquil
A language built on top of the Objective-C runtime, and ABI compatible with Objective-C.
https://github.com/fjolnir/Tranquil
Last synced: 3 months ago
JSON representation
A language built on top of the Objective-C runtime, and ABI compatible with Objective-C.
- Host: GitHub
- URL: https://github.com/fjolnir/Tranquil
- Owner: fjolnir
- License: other
- Created: 2012-07-01T12:41:55.000Z (almost 12 years ago)
- Default Branch: master
- Last Pushed: 2021-07-09T05:06:45.000Z (almost 3 years ago)
- Last Synced: 2024-01-18T08:23:52.804Z (5 months ago)
- Language: Objective-C++
- Homepage:
- Size: 4.21 MB
- Stars: 322
- Watchers: 21
- Forks: 17
- Open Issues: 4
-
Metadata Files:
- Readme: ReadMe.md
- License: License.md
Lists
- awesome-stars - fjolnir/Tranquil - A language built on top of the Objective-C runtime, and ABI compatible with Objective-C. (Objective-C++)
- alex-mikhalev-awesome-stars - Tranquil - A language built on top of the Objective-C runtime, and ABI compatible with Objective-C. (Objective-C++)
- awesome-stars - fjolnir/Tranquil - A language built on top of the Objective-C runtime, and ABI compatible with Objective-C. (Objective-C++)
README
# Tranquil
*This project is pretty much abandoned. It's too much work to keep up with the changing LLVM APIs*
Tranquil is a programming language built on top of LLVM & the Objective-C Runtime.
It aims to provide a more expressive & easy to use way to write Mac and iOS Apps.
Its features include:
* Compatibility with C/ObjC headers, meaning that there is no need to create special bindings for C APIs.
* Automatic memory management.
* Line by line debugging. (Using LLDB or GDB) — *still under development, but breaking on, and stepping over source lines is supported*
* Dynamic Typing.
* Language level concurrency support.
* String interpolation.
* Multiple assignment.
* Message cascading.
* Unlimited number range.
* Unicode through&through (変数=123 works fine)
* Good performance, even at this extremely early stage.
* And more..However, Tranquil is still extremely experimental and you shouldn't use it for anything other than exploration and learning.
## How to build and run
The simplest way of getting started is to use the binary [installer](http://d.asgeirsson.is/UGKR). Everything will be placed into `/usr/local/tranquil` (Requires Xcode 5.1 to be installed)
If you wish to contribute, you can use the install script instead which checks out the latest source and sets up the development environment.
> curl -fsSkL https://raw.github.com/fjolnir/Tranquil/master/Tools/install.sh | /bin/zsh
> /usr/local/tranquil/bin/tqrepl**Note:** OS X ≥ 10.7 or iOS ≥ 5 is required to run compiled tranquil programs. 10.9 is required to compile.
## Learning the language
To learn more about Tranquil you should read the [specification](https://github.com/fjolnir/Tranquil/blob/master/Docs/Tranquil%20Spec.md) and check out the [tests](https://github.com/fjolnir/Tranquil/blob/master/Tests).
You can also talk to me directly by visiting [#tranquil](irc://irc.freenode.net/tranquil) on irc.freenode.net.
And here're a couple of examples:
### Print a Mandelbrot fractal
```
mandelbrot = { x, y, bailout=16, maxIter=1000 |
cr, ci = y-0.5, x
zi, zr = 0
maxIter times: {
temp = zr*zi
zr2, zi2 = zr^2, zi^2
zr = zr2 - zi2 + cr
zi = 2*temp + ci
^^no if zi2 + zr2 > bailout
}
^yes
}
(-1 to: 1 withStep: 1/40) each: { y |
(-1 to: 1 withStep: 1/40) each: { x |
(mandelbrot(x, y) ? #● ! #◦) printWithoutNl
}
}
```### Iterate an array
```
alternatives = ["Objective-C", "Ruby", "Nu", "Perl", "Python"]
alternatives each: `alternative | "Tranquil is nicer than «alternative»" print`
"Or so I hope at least." print
```### Reduce
```
sum = (0 to: 1000000) reduce: `obj, accum=0 | obj+accum`
```### Do two things at the same time
```
a = async foo()
b = bar()
whenFinished {
"a is «a» and b is: «b»" print
}
```### Chain messages (Without having to return self from every method you write)
```
var = Character new setName: "Deckard"; setOccupation: "Blade Runner"; self
```### Do multiple assignment
```
a, b = b, a \ Swap b&a
```### Return non-locally
```
a = {
b = {
^^123
}
b()
^321
}
a() print \ This prints '123'
```### Calculate fibonacci numbers (In a not-so-performant manner)
```
fib = `n | n > 1 ? fib(n-1) + fib(n-2) ! n`
fib(10) print
```### Make a database query (Using [DatabaseKit](http://github.com/fjolnir/DatabaseKit))
import "DatabaseKit"
db = DB withURL: "sqlite://data/database.sqlite"
query = db[#aTable] select: #field; where: { #anotherField => aValue }
val = query[#field]
\ We can write that more concisely as:
val = table[{ #anotherField => aValue }][#field]
### Create a Web Server (Using [HTTPKit](http://github.com/fjolnir/HTTPKit))import "HTTPKit"
HTTP new handleGet: "/"
with: `connection| "Hello World!"`;
listenOnPort: 8080
onError: `"Unable to start server" print`
### Evaluate a regular expression```
"Foobar starts with foo." print if /foo[a-z]+/i matches: "Foobar"
```### Use the OpenGL & GLUT APIs
```
import "GLUT" \ This simply reads in your GLUT.h header. No bindings are required.GlutInit(0, nil)
GlutInitDisplayMode(GLUT_DOUBLE)
GlutInitWindowSize(640, 480)
GlutInitWindowPosition(200, 200)
GlutCreateWindow("Tranquil is cool as beans!")GlClearColor(0, 0, 0, 0)
GlScalef(0.4, 0.4, 0.4)GlutDisplayFunc({
GlRotatef(0.1, 0, 1, 0)
GlClear(GL_COLOR_BUFFER_BIT)
GlColor3f(0, 1, 0)
GlutWireDodecahedron()
GlColor3f(1, 1, 1)
GlutWireTeapot(0.7)
GlutSwapBuffers()
})lastX, lastY = 0
GlutMotionFunc({ x, y |
dx, dy = lastX - x, lastY - y
GlRotatef(dx, 0, 1, 0)
GlRotatef(dy, 1, 0, 0)
lastX, lastY = x, y
})GlutIdleFunc(GlutPostRedisplay)
GlutMainLoop()
```