commit
d6399f2740
20
README.md
20
README.md
@ -27,6 +27,7 @@ npm start
|
|||||||
|
|
||||||
- `(import path rect)` Imports a graphic file with format.
|
- `(import path rect)` Imports a graphic file with format.
|
||||||
- `(export path ~format ~quality)` Exports a graphic file with format.
|
- `(export path ~format ~quality)` Exports a graphic file with format.
|
||||||
|
- `(open path)` Imports a graphic file and resizes the frame.
|
||||||
- `(pos x y ~t)` Returns a position shape.
|
- `(pos x y ~t)` Returns a position shape.
|
||||||
- `(size w h ~t)` Returns a size shape.
|
- `(size w h ~t)` Returns a size shape.
|
||||||
- `(rect x y w h ~t)` Returns a rect shape.
|
- `(rect x y w h ~t)` Returns a rect shape.
|
||||||
@ -37,7 +38,7 @@ npm start
|
|||||||
- `(stroke ~shape)` Strokes a shape.
|
- `(stroke ~shape)` Strokes a shape.
|
||||||
- `(fill ~rect)` Fills a shape.
|
- `(fill ~rect)` Fills a shape.
|
||||||
- `(clear ~rect)` Clears a rect.
|
- `(clear ~rect)` Clears a rect.
|
||||||
- `(concat ...items)`
|
- `(concat ...items)` Concat multiple strings.
|
||||||
- `(add ...args)` Adds values.
|
- `(add ...args)` Adds values.
|
||||||
- `(sub ...args)` Subtracts values.
|
- `(sub ...args)` Subtracts values.
|
||||||
- `(mul ...args)` Multiplies values.
|
- `(mul ...args)` Multiplies values.
|
||||||
@ -69,32 +70,29 @@ npm start
|
|||||||
- `(range start end ~step)`
|
- `(range start end ~step)`
|
||||||
- `(get item key)` Gets an object's parameter with name.
|
- `(get item key)` Gets an object's parameter with name.
|
||||||
- `(set item key val)` Sets an object's parameter with name as value.
|
- `(set item key val)` Sets an object's parameter with name as value.
|
||||||
- `(of h ...keys)`
|
- `(of h ...keys)` Gets object parameters with names.
|
||||||
- `(frame)` Returns a rect of the frame.
|
- `(frame)` Returns a rect of the frame.
|
||||||
- `(center)` Returns a position of the center of the frame.
|
- `(center)` Returns a position of the center of the frame.
|
||||||
- `(scale rect w h)`
|
|
||||||
- `(resize w h ~fit)` Resizes the canvas to target w and h, returns the rect.
|
- `(resize w h ~fit)` Resizes the canvas to target w and h, returns the rect.
|
||||||
- `(rescale w h)` Rescales the canvas to target ratio of w and h, returns the rect.
|
- `(rescale w h)` Rescales the canvas to target ratio of w and h, returns the rect.
|
||||||
- `(crop rect)`
|
- `(crop rect)` Crop canvas to rect.
|
||||||
- `(clone a b)`
|
- `(clone a b)`
|
||||||
- `(theme variable ~el)`
|
- `(theme variable ~el)`
|
||||||
- `(gradient [x1 y1 x2 y2] ~colors 'black'])`
|
- `(gradient [x1 y1 x2 y2] ~colors 'black'])`
|
||||||
- `(pixels rect fn q)`
|
- `(pixels rect fn q)`
|
||||||
- `(saturation pixel ~q)`
|
- `(saturation pixel ~q)`
|
||||||
- `(contrast pixel ~q)`
|
- `(contrast pixel ~q)`
|
||||||
- `(echo ...args)`
|
|
||||||
- `(str ...args)`
|
|
||||||
- `(open path)` Imports a graphic file and resizes the frame.
|
|
||||||
- `(dir ~path)` Returns the content of a directory.
|
- `(dir ~path)` Returns the content of a directory.
|
||||||
- `(file ~path)` Returns the content of a file
|
- `(file ~path)` Returns the content of a file.
|
||||||
- `(dirpath ~path)` Returns the path of a directory.
|
- `(dirpath ~path)` Returns the path of a directory.
|
||||||
- `(filepath ~path)` Returns the path of a file
|
- `(filepath ~path)` Returns the path of a file.
|
||||||
- `(exit ~force)` Exits Ronin.
|
- `(exit ~force)` Exits Ronin.
|
||||||
- `(time)` Returns timestamp in milliseconds.
|
- `(echo ...args)`
|
||||||
|
- `(time ~rate)` Returns timestamp in milliseconds.
|
||||||
- `(animate ~play)` Toggles animation.
|
- `(animate ~play)` Toggles animation.
|
||||||
- `(js)` Javascript interop.
|
- `(js)` Javascript interop.
|
||||||
- `(test name a b)`
|
- `(test name a b)`
|
||||||
- `(benchmark fn)` logs time taken to execute a function
|
- `(benchmark fn)` logs time taken to execute a function.
|
||||||
|
|
||||||
## Extras
|
## Extras
|
||||||
|
|
||||||
|
11
desktop/sources/lisp/prelude.lisp
Normal file
11
desktop/sources/lisp/prelude.lisp
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
(echo "Loading prelude.lisp")
|
||||||
|
|
||||||
|
(defn translate
|
||||||
|
(r p)
|
||||||
|
(clone
|
||||||
|
r
|
||||||
|
(rect
|
||||||
|
(of p :x)
|
||||||
|
(of p :y)
|
||||||
|
(of r :w)
|
||||||
|
(of r :h))))
|
@ -35,12 +35,13 @@ function Commander (ronin) {
|
|||||||
if (txt.indexOf('$') > -1) { ronin.log('Present: $'); return }
|
if (txt.indexOf('$') > -1) { ronin.log('Present: $'); return }
|
||||||
const inter = new Lisp(txt, ronin.library)
|
const inter = new Lisp(txt, ronin.library)
|
||||||
inter.toPixels()
|
inter.toPixels()
|
||||||
ronin.always && requestAnimationFrame(() => this.run(txt))
|
ronin.always === true && requestAnimationFrame(() => this.run(txt))
|
||||||
}
|
}
|
||||||
|
|
||||||
this.load = function (txt) {
|
this.load = function (txt) {
|
||||||
|
ronin.animate(false)
|
||||||
this._input.value = txt
|
this._input.value = txt
|
||||||
this.run()
|
this.run(txt)
|
||||||
}
|
}
|
||||||
|
|
||||||
this.reindent = function () {
|
this.reindent = function () {
|
||||||
|
@ -13,6 +13,10 @@ function Library (ronin) {
|
|||||||
return path
|
return path
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.open = async (path) => { // Imports a graphic file and resizes the frame.
|
||||||
|
return ronin.surface.open(path)
|
||||||
|
}
|
||||||
|
|
||||||
// Shapes
|
// Shapes
|
||||||
|
|
||||||
this.pos = (x, y, t = 'pos') => { // Returns a position shape.
|
this.pos = (x, y, t = 'pos') => { // Returns a position shape.
|
||||||
@ -62,7 +66,7 @@ function Library (ronin) {
|
|||||||
|
|
||||||
// Strings
|
// Strings
|
||||||
|
|
||||||
this.concat = function (...items) {
|
this.concat = function (...items) { // Concat multiple strings.
|
||||||
return items.reduce((acc, item) => { return `${acc}${item}` }, '')
|
return items.reduce((acc, item) => { return `${acc}${item}` }, '')
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,12 +227,20 @@ function Library (ronin) {
|
|||||||
return item[key]
|
return item[key]
|
||||||
}
|
}
|
||||||
|
|
||||||
this.of = (h, ...keys) => {
|
this.of = (h, ...keys) => { // Gets object parameters with names.
|
||||||
return keys.reduce((acc, key) => {
|
return keys.reduce((acc, key) => {
|
||||||
return acc[key]
|
return acc[key]
|
||||||
}, h)
|
}, h)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.keys = (item) => { // Returns a list of the object's keys
|
||||||
|
return Object.keys(item)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.values = (item) => { // Returns a list of the object's values
|
||||||
|
return Object.values(item)
|
||||||
|
}
|
||||||
|
|
||||||
// Frame
|
// Frame
|
||||||
|
|
||||||
this.frame = () => { // Returns a rect of the frame.
|
this.frame = () => { // Returns a rect of the frame.
|
||||||
@ -240,10 +252,6 @@ function Library (ronin) {
|
|||||||
return this.pos(rect.w / 2, rect.h / 2)
|
return this.pos(rect.w / 2, rect.h / 2)
|
||||||
}
|
}
|
||||||
|
|
||||||
this.scale = (rect, w, h) => {
|
|
||||||
return { x: rect.x, y: rect.y, w: rect.w * w, h: rect.h * h }
|
|
||||||
}
|
|
||||||
|
|
||||||
this.resize = async (w, h, fit = true) => { // Resizes the canvas to target w and h, returns the rect.
|
this.resize = async (w, h, fit = true) => { // Resizes the canvas to target w and h, returns the rect.
|
||||||
const rect = { x: 0, y: 0, w, h }
|
const rect = { x: 0, y: 0, w, h }
|
||||||
const a = document.createElement('img')
|
const a = document.createElement('img')
|
||||||
@ -264,7 +272,7 @@ function Library (ronin) {
|
|||||||
return ronin.surface.draw(b, rect)
|
return ronin.surface.draw(b, rect)
|
||||||
}
|
}
|
||||||
|
|
||||||
this.crop = async (rect) => {
|
this.crop = async (rect) => { // Crop canvas to rect.
|
||||||
return ronin.surface.crop(rect)
|
return ronin.surface.crop(rect)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -310,45 +318,35 @@ function Library (ronin) {
|
|||||||
return [pixel.r * q + intercept, pixel.g * q + intercept, pixel.b * q + intercept, pixel.a]
|
return [pixel.r * q + intercept, pixel.g * q + intercept, pixel.b * q + intercept, pixel.a]
|
||||||
}
|
}
|
||||||
|
|
||||||
// Misc
|
|
||||||
|
|
||||||
this.echo = (...args) => {
|
|
||||||
ronin.log(args)
|
|
||||||
return args
|
|
||||||
}
|
|
||||||
|
|
||||||
this.str = (...args) => {
|
|
||||||
return args.reduce((acc, val) => { return acc + val }, '')
|
|
||||||
}
|
|
||||||
|
|
||||||
this.open = async (path) => { // Imports a graphic file and resizes the frame.
|
|
||||||
return ronin.surface.open(path)
|
|
||||||
}
|
|
||||||
|
|
||||||
// File System
|
// File System
|
||||||
|
|
||||||
this.dir = (path = ronin.source.path) => { // Returns the content of a directory.
|
this.dir = (path = this.dirpath()) => { // Returns the content of a directory.
|
||||||
return fs.existsSync(path) ? fs.readdirSync(path) : []
|
return fs.existsSync(path) ? fs.readdirSync(path) : []
|
||||||
}
|
}
|
||||||
|
|
||||||
this.file = (path = ronin.source.path) => { // Returns the content of a file
|
this.file = (path = this.filepath()) => { // Returns the content of a file.
|
||||||
return fs.existsSync(path) ? fs.readFileSync(p, 'utf8') : ''
|
return fs.existsSync(path) ? fs.readFileSync(path, 'utf8') : ''
|
||||||
}
|
}
|
||||||
|
|
||||||
this.dirpath = (path = ronin.source.path) => { // Returns the path of a directory.
|
this.dirpath = (path = this.filepath()) => { // Returns the path of a directory.
|
||||||
return require('path').dirname(path)
|
return require('path').dirname(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
this.filepath = (path = ronin.source.path) => { // Returns the path of a file
|
this.filepath = (path = ronin.source.path) => { // Returns the path of a file.
|
||||||
return fs.existsSync(path) ? fs.readdirSync(path) : []
|
return path
|
||||||
}
|
}
|
||||||
|
|
||||||
this.exit = (force = false) => { // Exits Ronin.
|
this.exit = (force = false) => { // Exits Ronin.
|
||||||
ronin.source.quit(force)
|
ronin.source.quit(force)
|
||||||
}
|
}
|
||||||
|
|
||||||
this.time = () => { // Returns timestamp in milliseconds.
|
this.echo = (...args) => {
|
||||||
return Date.now()
|
ronin.log(args)
|
||||||
|
return args
|
||||||
|
}
|
||||||
|
|
||||||
|
this.time = (rate = 1) => { // Returns timestamp in milliseconds.
|
||||||
|
return (Date.now() * rate)
|
||||||
}
|
}
|
||||||
|
|
||||||
this.animate = (play = true) => { // Toggles animation.
|
this.animate = (play = true) => { // Toggles animation.
|
||||||
@ -368,7 +366,7 @@ function Library (ronin) {
|
|||||||
return a === b
|
return a === b
|
||||||
}
|
}
|
||||||
|
|
||||||
this.benchmark = async (fn) => { // logs time taken to execute a function
|
this.benchmark = async (fn) => { // logs time taken to execute a function.
|
||||||
const start = Date.now()
|
const start = Date.now()
|
||||||
const result = await fn()
|
const result = await fn()
|
||||||
console.log(`time taken: ${Date.now() - start}ms`)
|
console.log(`time taken: ${Date.now() - start}ms`)
|
||||||
|
@ -22,7 +22,7 @@ function Lisp (input, lib) {
|
|||||||
include: (input, context) => {
|
include: (input, context) => {
|
||||||
if (!input[1].value || !fs.existsSync(input[1].value)) { console.warn('Source', input[1].value); return [] }
|
if (!input[1].value || !fs.existsSync(input[1].value)) { console.warn('Source', input[1].value); return [] }
|
||||||
const file = fs.readFileSync(input[1].value, { encoding: 'utf-8' })
|
const file = fs.readFileSync(input[1].value, { encoding: 'utf-8' })
|
||||||
return interpret(this.parse(file), context)
|
return interpret(this.parse(`(${file})`), context)
|
||||||
},
|
},
|
||||||
let: function (input, context) {
|
let: function (input, context) {
|
||||||
const letContext = input[1].reduce(function (acc, x) {
|
const letContext = input[1].reduce(function (acc, x) {
|
||||||
@ -65,6 +65,27 @@ function Lisp (input, lib) {
|
|||||||
return interpret(input[2], context)
|
return interpret(input[2], context)
|
||||||
}
|
}
|
||||||
return input[3] ? interpret(input[3], context) : []
|
return input[3] ? interpret(input[3], context) : []
|
||||||
|
},
|
||||||
|
__fn: function (input, context) {
|
||||||
|
return async function () {
|
||||||
|
const lambdaArguments = arguments
|
||||||
|
const keys = [...new Set(input.slice(2).flat(100).filter(i =>
|
||||||
|
i.type === TYPES.identifier &&
|
||||||
|
i.value[0] === '%'
|
||||||
|
).map(x => x.value).sort())]
|
||||||
|
const lambdaScope = keys.reduce(function (acc, x, i) {
|
||||||
|
acc[x] = lambdaArguments[i]
|
||||||
|
return acc
|
||||||
|
}, {})
|
||||||
|
return interpret(input.slice(1), new Context(lambdaScope, context))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
__obj: async function (input, context) {
|
||||||
|
const obj = {}
|
||||||
|
for (let i = 1 ; i<input.length ; i+=2) {
|
||||||
|
obj[await interpret(input[i] ,context)] = await interpret(input[i+1], context)
|
||||||
|
}
|
||||||
|
return obj
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,6 +119,8 @@ function Lisp (input, lib) {
|
|||||||
return { type: TYPES.number, value: parseFloat(input) }
|
return { type: TYPES.number, value: parseFloat(input) }
|
||||||
} else if (input[0] === '"' && input.slice(-1) === '"') {
|
} else if (input[0] === '"' && input.slice(-1) === '"') {
|
||||||
return { type: TYPES.string, value: input.slice(1, -1) }
|
return { type: TYPES.string, value: input.slice(1, -1) }
|
||||||
|
} else if (input[0] === ':') {
|
||||||
|
return { type: TYPES.string, value: input.slice(1) }
|
||||||
} else if (input === 'true' || input === 'false') {
|
} else if (input === 'true' || input === 'false') {
|
||||||
return { type: TYPES.bool, value: input === 'true' }
|
return { type: TYPES.bool, value: input === 'true' }
|
||||||
} else {
|
} else {
|
||||||
@ -110,10 +133,18 @@ function Lisp (input, lib) {
|
|||||||
const token = input.shift()
|
const token = input.shift()
|
||||||
if (token === undefined) {
|
if (token === undefined) {
|
||||||
return list.pop()
|
return list.pop()
|
||||||
|
} else if (token === '\'(') {
|
||||||
|
input.unshift('__fn')
|
||||||
|
list.push(parenthesize(input, []))
|
||||||
|
return parenthesize(input, list)
|
||||||
|
} else if (token === '{') {
|
||||||
|
input.unshift('__obj')
|
||||||
|
list.push(parenthesize(input, []))
|
||||||
|
return parenthesize(input, list)
|
||||||
} else if (token === '(') {
|
} else if (token === '(') {
|
||||||
list.push(parenthesize(input, []))
|
list.push(parenthesize(input, []))
|
||||||
return parenthesize(input, list)
|
return parenthesize(input, list)
|
||||||
} else if (token === ')') {
|
} else if (token === ')' || token === '}') {
|
||||||
return list
|
return list
|
||||||
} else {
|
} else {
|
||||||
return parenthesize(input, list.concat(categorize(token)))
|
return parenthesize(input, list.concat(categorize(token)))
|
||||||
@ -121,7 +152,18 @@ function Lisp (input, lib) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const tokenize = function (input) {
|
const tokenize = function (input) {
|
||||||
return input.replace(/^\;.*\n?/gm, '').split('"').map(function (x, i) { return i % 2 === 0 ? x.replace(/\(/g, ' ( ').replace(/\)/g, ' ) ') : x.replace(/ /g, '!whitespace!') }).join('"').trim().split(/\s+/).map(function (x) { return x.replace(/!whitespace!/g, ' ') })
|
const i = input.replace(/^\;.*\n?/gm, '').split('"')
|
||||||
|
return i.map(function (x, i) {
|
||||||
|
return i % 2 === 0 ?
|
||||||
|
x.replace(/\(/g, ' ( ')
|
||||||
|
.replace(/\)/g, ' ) ')
|
||||||
|
.replace(/' \( /g, ' \'( ') // '()
|
||||||
|
.replace(/\{/g, ' { ') // {}
|
||||||
|
.replace(/\}/g, ' } ') // {}
|
||||||
|
: x.replace(/ /g, '!whitespace!')
|
||||||
|
})
|
||||||
|
.join('"').trim().split(/\s+/)
|
||||||
|
.map(function (x) { return x.replace(/!whitespace!/g, ' ') })
|
||||||
}
|
}
|
||||||
|
|
||||||
this.parse = function (input) {
|
this.parse = function (input) {
|
||||||
@ -129,6 +171,8 @@ function Lisp (input, lib) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.toPixels = async function () {
|
this.toPixels = async function () {
|
||||||
return interpret(this.parse(input))
|
return interpret(this.parse(`(
|
||||||
|
(include "./sources/lisp/prelude.lisp")
|
||||||
|
${input})`))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ function Source (ronin) {
|
|||||||
if (!fs.existsSync(loc)) { console.warn('Source', 'File does not exist: ' + loc); return }
|
if (!fs.existsSync(loc)) { console.warn('Source', 'File does not exist: ' + loc); return }
|
||||||
console.log('Source', 'Reading ' + loc)
|
console.log('Source', 'Reading ' + loc)
|
||||||
this.path = loc
|
this.path = loc
|
||||||
this.load(fs.readFileSync(this.path, 'utf8'))
|
ronin.commander.load(fs.readFileSync(this.path, 'utf8'))
|
||||||
ronin.log(`Reading file.`)
|
ronin.log(`Reading file.`)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,10 +74,6 @@ function Source (ronin) {
|
|||||||
ronin.commander.run()
|
ronin.commander.run()
|
||||||
}
|
}
|
||||||
|
|
||||||
this.load = function (data) {
|
|
||||||
ronin.commander._input.value = data
|
|
||||||
}
|
|
||||||
|
|
||||||
this.quit = function (force = false) {
|
this.quit = function (force = false) {
|
||||||
if (this.hasChanges() === true && force === false) {
|
if (this.hasChanges() === true && force === false) {
|
||||||
this.verify()
|
this.verify()
|
||||||
|
@ -1,17 +1,17 @@
|
|||||||
; animate
|
; animate
|
||||||
(
|
|
||||||
(clear)
|
(clear)
|
||||||
(def t
|
(def t
|
||||||
(sin
|
(sin
|
||||||
(div
|
(div
|
||||||
(time) 100)))
|
(time) 100)))
|
||||||
(def pos
|
(def pos
|
||||||
(add 200 30
|
(add 200 30
|
||||||
(mul 30 t)))
|
(mul 30 t)))
|
||||||
(defn square
|
(defn square
|
||||||
(a)
|
(a)
|
||||||
(rect a a a a))
|
(rect a a a a))
|
||||||
(stroke
|
(stroke
|
||||||
(square pos) 1 "red")
|
(square pos) 1 "red")
|
||||||
; set false to stop
|
; set false to stop
|
||||||
(animate true))
|
(animate true)
|
@ -1,31 +1,26 @@
|
|||||||
(echo (map (lambda (a) (add a 1)) (1 2 3)))
|
(echo (map '(add %1 1) (1 2 3)))
|
||||||
|
|
||||||
(
|
(echo (first (1 2 3)))
|
||||||
(echo (first (1 2 3)))
|
(echo (rest (1 2 3)))
|
||||||
(echo (rest (1 2 3)))
|
|
||||||
)
|
|
||||||
|
|
||||||
(echo
|
(echo
|
||||||
(filter
|
(filter
|
||||||
(lambda (a) (eq 0 (mod a 2)))
|
'(eq 0 (mod %1 2))
|
||||||
(1 2 3 4 5))
|
(1 2 3 4 5))
|
||||||
)
|
)
|
||||||
|
|
||||||
(
|
(clear)
|
||||||
(clear)
|
(map
|
||||||
(map (lambda (a)
|
'(stroke (rect (mul a 30) 20 50 50)
|
||||||
(stroke (rect (mul a 30) 20 50 50)
|
1 "red")
|
||||||
1 "red"))
|
(range 0 20 5))
|
||||||
(range 0 20 5))
|
|
||||||
)
|
(map
|
||||||
|
'(stroke
|
||||||
|
(rect
|
||||||
|
(mul %1 10)
|
||||||
|
(add 250 (mul (sin %1) 250))
|
||||||
|
(mul 4 %1)
|
||||||
|
(add 20 (mul (cos %1) 50))) 1 "red")
|
||||||
|
(range 0 200 5))
|
||||||
|
|
||||||
(
|
|
||||||
(clear)
|
|
||||||
(map (lambda (a)
|
|
||||||
(stroke
|
|
||||||
(rect
|
|
||||||
(mul a 10)
|
|
||||||
(add 50 (mul (sin a) 40))
|
|
||||||
a
|
|
||||||
(add 20 (mul (cos a) 50))) 1 "red"))
|
|
||||||
(range 0 200 5)))
|
|
@ -1,9 +1,9 @@
|
|||||||
; basics
|
; basics
|
||||||
(
|
|
||||||
; define a variable
|
|
||||||
(def a 25)
|
|
||||||
(echo a)
|
|
||||||
|
|
||||||
; define a function
|
; define a variable
|
||||||
(defn add-two (a) (add 2 a))
|
(def a 25)
|
||||||
(echo (add-two 4)))
|
(echo a)
|
||||||
|
|
||||||
|
; define a function
|
||||||
|
(defn add-two (a) (add 2 a))
|
||||||
|
(echo (add-two 4))
|
14
examples/benchmark.fs.lisp
Normal file
14
examples/benchmark.fs.lisp
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
; filesystem
|
||||||
|
|
||||||
|
; print path
|
||||||
|
(echo
|
||||||
|
(filepath))
|
||||||
|
; print folder path
|
||||||
|
(echo
|
||||||
|
(dirpath))
|
||||||
|
; print file content
|
||||||
|
(echo
|
||||||
|
(file))
|
||||||
|
; print folder content
|
||||||
|
(echo
|
||||||
|
(dir))
|
@ -1,6 +1,5 @@
|
|||||||
; benchmark
|
; benchmark
|
||||||
|
|
||||||
(
|
|
||||||
; Basics
|
; Basics
|
||||||
|
|
||||||
(test "add" (add 8 4 2) 14)
|
(test "add" (add 8 4 2) 14)
|
||||||
@ -53,9 +52,8 @@
|
|||||||
|
|
||||||
; Generics
|
; Generics
|
||||||
|
|
||||||
(test "str" (str 1 4 "-" (add 3 4) ".jpg") "14-7.jpg")
|
(test "concat" (concat 1 4 "-" (add 3 4) ".jpg") "14-7.jpg")
|
||||||
|
|
||||||
; Interop
|
; Interop
|
||||||
(test "interop" ((of (of js "Math") "max") 2 4) 4)
|
(test "interop" ((of (of (js) "Math") "max") 2 4) 4)
|
||||||
(test "recursive key selector" ((of js "Math" "max") 2 4) 4)
|
(test "recursive key selector" ((of (js) "Math" "max") 2 4) 4)
|
||||||
)
|
|
@ -1,7 +1,5 @@
|
|||||||
; crop
|
; crop
|
||||||
|
|
||||||
(
|
(clear)
|
||||||
(clear)
|
(open "../static/crystal.jpg")
|
||||||
(open "../static/crystal.jpg")
|
(crop (rect 100 100 400 400))
|
||||||
(crop (rect 100 100 400 400))
|
|
||||||
)
|
|
@ -1,35 +1,33 @@
|
|||||||
; dejong attractor
|
; dejong attractor
|
||||||
|
|
||||||
(
|
(clear)
|
||||||
(clear)
|
(defn point (x y color)
|
||||||
(defn point (x y color)
|
(fill (rect x y 1 1) color))
|
||||||
(fill (rect x y 1 1) color))
|
|
||||||
|
|
||||||
(defn _dejong (x y a b c d)
|
(defn _dejong (x y a b c d)
|
||||||
(rest ((point
|
(rest ((point
|
||||||
(add 300 (mul 100 x))
|
(add 300 (mul 100 x))
|
||||||
(add 400 (mul 100 y))
|
(add 400 (mul 100 y))
|
||||||
"red")
|
"red")
|
||||||
(add (sin (mul a y)) (mul x (cos (mul b x))))
|
(add (sin (mul a y)) (mul x (cos (mul b x))))
|
||||||
(add (mul x (sin (mul x c))) (cos (mul d y)))
|
(add (mul x (sin (mul x c))) (cos (mul d y)))
|
||||||
))
|
))
|
||||||
)
|
|
||||||
|
|
||||||
(defn dejong (r a b c d)
|
|
||||||
(reduce
|
|
||||||
(lambda (acc val)
|
|
||||||
(first (
|
|
||||||
(_dejong (first acc) (last acc) a b c d)
|
|
||||||
)))
|
|
||||||
(range 0 r)
|
|
||||||
(2 1)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
(benchmark (lambda ()
|
|
||||||
(dejong 12800
|
|
||||||
(random -2 2)
|
|
||||||
(random -2 2)
|
|
||||||
(random -2 2)
|
|
||||||
(random -2 2)
|
|
||||||
)))
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
(defn dejong (r a b c d)
|
||||||
|
(reduce
|
||||||
|
(lambda (acc val)
|
||||||
|
(first (
|
||||||
|
(_dejong (first acc) (last acc) a b c d)
|
||||||
|
)))
|
||||||
|
(range 0 r)
|
||||||
|
(2 1)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(benchmark
|
||||||
|
'(dejong 12800
|
||||||
|
(random -2 2)
|
||||||
|
(random -2 2)
|
||||||
|
(random -2 2)
|
||||||
|
(random -2 2)
|
||||||
|
))
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
; filesystem
|
|
||||||
(
|
|
||||||
; get files
|
|
||||||
(def files
|
|
||||||
(dir
|
|
||||||
(dirpath)))
|
|
||||||
; pick a random file
|
|
||||||
(def random-index
|
|
||||||
(floor
|
|
||||||
(random
|
|
||||||
(len files))))
|
|
||||||
; print random file name
|
|
||||||
(echo
|
|
||||||
(get files random-index)))
|
|
@ -1,25 +1,18 @@
|
|||||||
; pixels
|
; Glitch
|
||||||
|
|
||||||
(
|
(clear)
|
||||||
(clear)
|
|
||||||
|
|
||||||
; Glitch
|
(defn glitch
|
||||||
|
(rec)
|
||||||
|
(if (gt rec 1)
|
||||||
|
(
|
||||||
|
(translate
|
||||||
|
(rect (random 400) (random 400) (random 10) (random 10))
|
||||||
|
(pos (random 400) (random 400)))
|
||||||
|
(glitch (sub rec 1)))))
|
||||||
|
|
||||||
(defn glitch
|
(import
|
||||||
(rec)
|
"../static/crystal.jpg"
|
||||||
(if (gt rec 1)
|
(rect 0 0 400 400))
|
||||||
((clone
|
|
||||||
(rect (random 400) (random 400) 2 2)
|
|
||||||
(rect (random 400) (random 400)
|
|
||||||
(random 10) (random 30)))
|
|
||||||
(glitch (sub rec 1))))
|
|
||||||
)
|
|
||||||
|
|
||||||
; Draw photo
|
(glitch 500)
|
||||||
|
|
||||||
(import
|
|
||||||
"../static/crystal.jpg"
|
|
||||||
(rect 0 0 400 400))
|
|
||||||
|
|
||||||
(glitch 500)
|
|
||||||
)
|
|
@ -1,4 +1,3 @@
|
|||||||
(
|
|
||||||
; gradients
|
; gradients
|
||||||
|
|
||||||
(clear)
|
(clear)
|
||||||
@ -12,5 +11,4 @@
|
|||||||
(svg "M255,60 L255,60 L135,180 L75,60 L195,210 L120,225 L105,225 L165,255 L225,195 L255,135 L285,150") 1
|
(svg "M255,60 L255,60 L135,180 L75,60 L195,210 L120,225 L105,225 L165,255 L225,195 L255,135 L285,150") 1
|
||||||
(gradient
|
(gradient
|
||||||
(50 0 180 0)
|
(50 0 180 0)
|
||||||
("black" "white" "blue" "green")))
|
("black" "white" "blue" "green")))
|
||||||
)
|
|
@ -1,57 +1,56 @@
|
|||||||
; guides
|
; guides
|
||||||
(
|
(clear)
|
||||||
(clear)
|
(stroke
|
||||||
(stroke
|
(frame) 1 "red")
|
||||||
(frame) 1 "red")
|
(stroke
|
||||||
(stroke
|
(line
|
||||||
(line
|
(pos 0 0)
|
||||||
(pos 0 0)
|
(pos
|
||||||
(pos
|
(of
|
||||||
|
(frame) "w")
|
||||||
|
(of
|
||||||
|
(frame) "h"))) 1 "red")
|
||||||
|
(stroke
|
||||||
|
(line
|
||||||
|
(pos
|
||||||
|
(of
|
||||||
|
(frame) "w") 0)
|
||||||
|
(pos 0
|
||||||
|
(of
|
||||||
|
(frame) "h"))) 1 "red")
|
||||||
|
(stroke
|
||||||
|
(line
|
||||||
|
(pos
|
||||||
|
(div
|
||||||
(of
|
(of
|
||||||
(frame) "w")
|
(frame) "w") 2) 0)
|
||||||
|
(pos
|
||||||
|
(div
|
||||||
(of
|
(of
|
||||||
(frame) "h"))) 1 "red")
|
(frame) "w") 2)
|
||||||
(stroke
|
(of
|
||||||
(line
|
(frame) "h"))) 1 "red")
|
||||||
(pos
|
(stroke
|
||||||
|
(line
|
||||||
|
(pos 0
|
||||||
|
(div
|
||||||
(of
|
(of
|
||||||
(frame) "w") 0)
|
(frame) "h") 2))
|
||||||
(pos 0
|
(pos
|
||||||
|
(div
|
||||||
(of
|
(of
|
||||||
(frame) "h"))) 1 "red")
|
(frame) "w") 2)
|
||||||
(stroke
|
(of
|
||||||
(line
|
(frame) "h"))) 1 "#72dec2")
|
||||||
(pos
|
(stroke
|
||||||
(div
|
(line
|
||||||
(of
|
(pos
|
||||||
(frame) "w") 2) 0)
|
(div
|
||||||
(pos
|
|
||||||
(div
|
|
||||||
(of
|
|
||||||
(frame) "w") 2)
|
|
||||||
(of
|
(of
|
||||||
(frame) "h"))) 1 "red")
|
(frame) "w") 2) 0)
|
||||||
(stroke
|
(pos
|
||||||
(line
|
(of
|
||||||
(pos 0
|
(frame) "w")
|
||||||
(div
|
(div
|
||||||
(of
|
|
||||||
(frame) "h") 2))
|
|
||||||
(pos
|
|
||||||
(div
|
|
||||||
(of
|
|
||||||
(frame) "w") 2)
|
|
||||||
(of
|
(of
|
||||||
(frame) "h"))) 1 "#72dec2")
|
(frame) "h") 2))) 1 "#72dec2")
|
||||||
(stroke
|
|
||||||
(line
|
|
||||||
(pos
|
|
||||||
(div
|
|
||||||
(of
|
|
||||||
(frame) "w") 2) 0)
|
|
||||||
(pos
|
|
||||||
(of
|
|
||||||
(frame) "w")
|
|
||||||
(div
|
|
||||||
(of
|
|
||||||
(frame) "h") 2))) 1 "#72dec2"))
|
|
@ -1,5 +1,5 @@
|
|||||||
(
|
(clear)
|
||||||
(def a (import
|
(def a (import
|
||||||
"../static/crystal.jpg"
|
"../static/crystal.jpg"
|
||||||
(rect 0 0 400 400)))
|
(rect 0 0 400 400)))
|
||||||
(echo a))
|
(echo a)
|
@ -1,4 +1,3 @@
|
|||||||
; include
|
; include
|
||||||
(
|
(include "../examples/recursive.lisp")
|
||||||
(include "../examples/recursive.lisp")
|
(echo line-color)
|
||||||
(echo line-color))
|
|
1
examples/lambda.lisp
Normal file
1
examples/lambda.lisp
Normal file
@ -0,0 +1 @@
|
|||||||
|
(echo (map '(add %1 2) (4 5 6))
|
15
examples/objects.lisp
Normal file
15
examples/objects.lisp
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
; objects
|
||||||
|
|
||||||
|
(test "symbols" :a "a")
|
||||||
|
|
||||||
|
(def ob {:a "fantastic" :b 2})
|
||||||
|
|
||||||
|
((of (js) :console :log) ob)
|
||||||
|
|
||||||
|
(echo (of ob :a))
|
||||||
|
|
||||||
|
(echo (keys ob))
|
||||||
|
(echo (values ob))
|
||||||
|
|
||||||
|
(set ob :a 4)
|
||||||
|
(echo (of ob :a))
|
@ -1,9 +1,7 @@
|
|||||||
; scale file
|
; saturate image
|
||||||
(
|
|
||||||
|
|
||||||
(open "../static/crystal.jpg")
|
(open "../static/crystal.jpg")
|
||||||
(pixels
|
(pixels
|
||||||
(frame)
|
(frame)
|
||||||
saturation
|
saturation
|
||||||
12)
|
12)
|
||||||
)
|
|
@ -1,7 +1,7 @@
|
|||||||
; pixels
|
; pixels
|
||||||
(
|
|
||||||
(clear)
|
(clear)
|
||||||
(import "../../PREVIEW.jpg"
|
(import "../../PREVIEW.jpg"
|
||||||
(frame))
|
(frame))
|
||||||
(pixels
|
(pixels
|
||||||
(rect 0 0 500 500) saturation 0.5))
|
(rect 0 0 500 500) saturation 0.5)
|
14
examples/random.file.lisp
Normal file
14
examples/random.file.lisp
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
; filesystem
|
||||||
|
|
||||||
|
; get files
|
||||||
|
(def files
|
||||||
|
(dir
|
||||||
|
(dirpath)))
|
||||||
|
; pick a random file
|
||||||
|
(def random-index
|
||||||
|
(floor
|
||||||
|
(random
|
||||||
|
(len files))))
|
||||||
|
; print random file name
|
||||||
|
(echo
|
||||||
|
(get files random-index))
|
@ -1,17 +1,17 @@
|
|||||||
; random
|
; random
|
||||||
(
|
|
||||||
(clear)
|
(clear)
|
||||||
(defn place
|
(defn place
|
||||||
(rec)
|
(rec)
|
||||||
(if
|
(if
|
||||||
(gt rec 0)
|
(gt rec 0)
|
||||||
(
|
(
|
||||||
(import "../static/crystal.jpg"
|
(import "../static/crystal.jpg"
|
||||||
(rect
|
(rect
|
||||||
(random 200)
|
(random 200)
|
||||||
(random 200)
|
(random 200)
|
||||||
(random 200)
|
(random 200)
|
||||||
(random 200)))
|
(random 200)))
|
||||||
(place
|
(place
|
||||||
(sub rec 1)))))
|
(sub rec 1)))))
|
||||||
(place 30))
|
(place 30)
|
@ -1,16 +1,16 @@
|
|||||||
; recursive
|
; recursive
|
||||||
(
|
|
||||||
(clear)
|
(clear)
|
||||||
(defn rec
|
(defn rec
|
||||||
(v)
|
(v)
|
||||||
(if
|
(if
|
||||||
(gt v 0)
|
(gt v 0)
|
||||||
(
|
(
|
||||||
(stroke
|
(stroke
|
||||||
(circle
|
(circle
|
||||||
(mul 5 v)
|
(mul 5 v)
|
||||||
(mul 5 v)
|
(mul 5 v)
|
||||||
(mul 5 v)) 1 "red")
|
(mul 5 v)) 1 "red")
|
||||||
(rec
|
(rec
|
||||||
(sub v 5)))))
|
(sub v 5)))))
|
||||||
(rec 100))
|
(rec 100)
|
@ -1,5 +1,5 @@
|
|||||||
; resize
|
; resize
|
||||||
(
|
|
||||||
(clear)
|
(clear)
|
||||||
(open "../../PREVIEW.jpg")
|
(open "../../PREVIEW.jpg")
|
||||||
(resize 0.5 0.5))
|
(resize 0.5 0.5)
|
@ -1,25 +1,24 @@
|
|||||||
; Shapes
|
; Shapes
|
||||||
|
|
||||||
((clear)
|
(clear)
|
||||||
|
|
||||||
; variables
|
; variables
|
||||||
(def center-w (div (of (frame) "w") 2))
|
(def center-w (div (of (frame) "w") 2))
|
||||||
(def center-h (div (of (frame) "h") 2))
|
(def center-h (div (of (frame) "h") 2))
|
||||||
(def rad (div (of (frame) "h") 4))
|
(def rad (div (of (frame) "h") 4))
|
||||||
|
|
||||||
; draw circle
|
|
||||||
(stroke
|
|
||||||
(circle center-w center-h rad) 2 "white")
|
|
||||||
|
|
||||||
; draw rect
|
; draw circle
|
||||||
(stroke
|
(stroke
|
||||||
(rect
|
(circle center-w center-h rad) 2 "white")
|
||||||
(sub center-w rad) (sub center-h rad) center-h center-h) 2 "white")
|
|
||||||
|
|
||||||
; draw line
|
; draw rect
|
||||||
(stroke
|
(stroke
|
||||||
(line
|
(rect
|
||||||
(pos (sub center-w rad) center-h)
|
(sub center-w rad) (sub center-h rad) center-h center-h) 2 "white")
|
||||||
(pos (add center-w rad) center-h)))
|
|
||||||
(stroke (text 10 170 200 "HELL") 2 "pink")
|
; draw line
|
||||||
)
|
(stroke
|
||||||
|
(line
|
||||||
|
(pos (sub center-w rad) center-h)
|
||||||
|
(pos (add center-w rad) center-h)))
|
||||||
|
(stroke (text 10 170 200 "HELL") 2 "pink")
|
@ -1,6 +1,6 @@
|
|||||||
; animated recusive spiral
|
; animated recusive spiral
|
||||||
; by @local_guru
|
; by @local_guru
|
||||||
(
|
|
||||||
(clear)
|
(clear)
|
||||||
(defn rec
|
(defn rec
|
||||||
(v)
|
(v)
|
||||||
@ -27,4 +27,4 @@
|
|||||||
(sub v 0.3)))))
|
(sub v 0.3)))))
|
||||||
; set false to stop
|
; set false to stop
|
||||||
(animate true)
|
(animate true)
|
||||||
(rec 300))
|
(rec 300)
|
@ -1,8 +1,8 @@
|
|||||||
(
|
|
||||||
(clear)
|
(clear)
|
||||||
; ronin path
|
; ronin path
|
||||||
(stroke
|
(stroke
|
||||||
(svg "M60,60 L195,60 A45,45 0 0,1 240,105 A45,45 0 0,1 195,150 L60,150 M195,150 A45,45 0 0,1 240,195 L240,240 ") 2 "white")
|
(svg "M60,60 L195,60 A45,45 0 0,1 240,105 A45,45 0 0,1 195,150 L60,150 M195,150 A45,45 0 0,1 240,195 L240,240 ") 2 "white")
|
||||||
; outline
|
; outline
|
||||||
(stroke
|
(stroke
|
||||||
(svg "M15,15 L15,15 L285,15 L285,285 L15,285 Z") 1 "#555"))
|
(svg "M15,15 L15,15 L285,15 L285,285 L15,285 Z") 1 "#555")
|
@ -1,38 +1,38 @@
|
|||||||
; theme
|
; theme
|
||||||
(
|
|
||||||
(clear)
|
(clear)
|
||||||
(def col
|
(def col
|
||||||
(lambda
|
(lambda
|
||||||
(i)
|
(i)
|
||||||
(of
|
(of
|
||||||
(
|
(
|
||||||
(theme "f_high")
|
(theme "f_high")
|
||||||
(theme "f_med")
|
(theme "f_med")
|
||||||
(theme "f_low")
|
(theme "f_low")
|
||||||
(theme "f_inv")
|
(theme "f_inv")
|
||||||
(theme "b_high")
|
(theme "b_high")
|
||||||
(theme "b_med")
|
(theme "b_med")
|
||||||
(theme "b_low")
|
(theme "b_low")
|
||||||
(theme "b_inv"))
|
(theme "b_inv"))
|
||||||
(mod i 8))))
|
(mod i 8))))
|
||||||
(def rec
|
(def rec
|
||||||
(lambda
|
(lambda
|
||||||
(v i)
|
(v i)
|
||||||
(if
|
(if
|
||||||
(gt v 0)
|
(gt v 0)
|
||||||
(
|
(
|
||||||
(fill
|
(fill
|
||||||
(circle
|
(circle
|
||||||
(add
|
(add
|
||||||
(div
|
(div
|
||||||
(of
|
(of
|
||||||
(frame) "w") 1.6)
|
(frame) "w") 1.6)
|
||||||
(mul 1.5 v))
|
(mul 1.5 v))
|
||||||
(mul 10 v)
|
(mul 10 v)
|
||||||
(mul v
|
(mul v
|
||||||
(div v 5)))
|
(div v 5)))
|
||||||
(col i))
|
(col i))
|
||||||
(rec
|
(rec
|
||||||
(sub v 3)
|
(sub v 3)
|
||||||
(add i 1))))))
|
(add i 1))))))
|
||||||
(rec 40 0))
|
(rec 40 0)
|
Loading…
x
Reference in New Issue
Block a user