Skip to content

Instantly share code, notes, and snippets.

@Villane
Created April 8, 2013 20:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Villane/5340353 to your computer and use it in GitHub Desktop.
Save Villane/5340353 to your computer and use it in GitHub Desktop.
An example of complex numbers syntax in Slang
// Add some prefix operators to the grammar
group complexPre = "ℜ…", "ℑ…", "Re…", "Im…"
// Make them bind tighter than anything, so we don't need parens
control -> complexPre
relations -> complexPre
arithmetic -> complexPre
brackets -> complexPre
// Complex type with some operators
val class Complex ⟨_real: Double, _imag: Double⟩ {
def real() = _real
def imag() = _imag
def dot(v: Complex) = `intrinsic.dotproduct.v2f64`(data, v)
alias ∙ = dot
alias ℜ… = real
alias Re… = real
alias ℑ… = imag
alias Im… = imag
def magnitude() = √(_real² + _imag²)
alias |…| = magnitude
}
// Alias for the type and it's generated constructor function
type ℂ = Complex
alias ℂ = Complex
// Example based on LLVM Kaleidoscope tutorial http://llvm.org/docs/tutorial/LangImpl6.html#example
// Determine whether the specific location diverges.
// Solve for z = z^2 + c in the complex plane.
def mandelbrotConverger(z0: ℂ, c: ℂ, iters: Int) =
loop (i := iters, z := z0) while i < 1000 ∧ |z| ≤ 2.0
do (i := i + 1, z := ℂ⟨ℜ z² - ℑ z² + ℜ c, 2.0 * ℜ z * ℑ z + ℑ c⟩)
yield i
def mandelbrotConverge(z: ℂ) = mandelbrotConverger(z, z, 0)
// Compute and plot the mandlebrot set with the specified 2 dimensional range info.
def mandelbrotHelper(min: ℂ, max: ℂ, step: ℂ) =
loop(y := ℑ min) while y < ℑ max do {
loop(x := ℜ min) while x < ℜ max do {
printdensity(mandelbrotConverge(ℂ⟨x, y⟩));
(x + ℜ step)
};
putchar(10);
(y + ℑ step)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment