From 7d88b6deb891f240e13cb5972514010b2a881b75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9Bu=20=D0=9Binve=D0=B3a?= Date: Sat, 20 Jul 2019 08:40:54 +0900 Subject: [PATCH 01/11] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c953b45..2de1479 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ _"All I wanted, was a quick way of resizing a few photos.."_ -Ronin is a [LISP](https://en.wikipedia.org/wiki/Lisp_(programming_language)) repl to create generative graphics currently under development. You can follow the daily progress on [Mastodon](https://merveilles.town/@neauoire/). +The application interprets a dialect of [LISP](https://en.wikipedia.org/wiki/Lisp_(programming_language)) to automate simple graphical tasks, like resizing, cropping, coloring, and generating procedural imagery. You can look at these [example files](https://github.com/hundredrabbits/Ronin/tree/master/examples) to better understand how this all works. ## Install & Run From 93c69db90855a6dd44aeb72f682d6de6e077c099 Mon Sep 17 00:00:00 2001 From: Devine Lu Linvega Date: Sat, 20 Jul 2019 15:49:34 +0900 Subject: [PATCH 02/11] Added full commander expand --- desktop/sources/index.html | 1 + desktop/sources/links/main.css | 1 + desktop/sources/scripts/commander.js | 8 ++++---- desktop/sources/scripts/library.js | 18 +++++++++++++++++- examples/animate.lisp | 24 ++++++++++++++---------- examples/fs.lisp | 11 +++++++++++ 6 files changed, 48 insertions(+), 15 deletions(-) create mode 100644 examples/fs.lisp diff --git a/desktop/sources/index.html b/desktop/sources/index.html index d3a5353..955ce4b 100644 --- a/desktop/sources/index.html +++ b/desktop/sources/index.html @@ -45,6 +45,7 @@ ronin.controller.add("default","View","Zoom Out",() => { ronin.modZoom(-0.25) },"CmdOrCtrl+-") ronin.controller.add("default","View","Zoom Reset",() => { ronin.modZoom(1,true) },"CmdOrCtrl+0") ronin.controller.add("default","View","Toggle Commander",() => { ronin.commander.toggle(); },"CmdOrCtrl+K"); + ronin.controller.add("default","View","Expand Commander",() => { ronin.commander.toggle(true); },"CmdOrCtrl+Shift+K"); ronin.controller.add("default","Project","Run",() => { ronin.commander.run(); },"CmdOrCtrl+R"); ronin.controller.add("default","Project","Reload Run",() => { ronin.source.revert(); ronin.commander.run(); },"CmdOrCtrl+Shift+R"); ronin.controller.add("default","Project", "Animate",() => { ronin.animate(!ronin.always); },"CmdOrCtrl+Shift+T"); diff --git a/desktop/sources/links/main.css b/desktop/sources/links/main.css index 8abe5c2..4a9d7de 100644 --- a/desktop/sources/links/main.css +++ b/desktop/sources/links/main.css @@ -7,6 +7,7 @@ body { margin:0px; padding:0px; overflow:hidden; font-family:"input_mono_regular #ronin #wrapper #commander { z-index: 9000;position: relative;width: 310px;height: calc(100vh - 60px);-webkit-app-region: no-drag;padding-right: 30px;transition: margin-left 250ms;} #ronin #wrapper #commander textarea { background: none; width: 100%; height: calc(100vh - 105px); resize: none; font-size: 12px;line-height: 15px; padding-right: 15px} #ronin #wrapper #commander div#status { position: absolute; bottom: 0px; text-transform: lowercase;} +#ronin.expand #wrapper #commander { width:100%; } #ronin.hidden #wrapper #commander { margin-left:-331px; } #ronin canvas#surface,#ronin canvas#guide { position: absolute; top:0px; -webkit-user-select: none;-webkit-app-region: no-drag; background-image: url("data:image/svg+xml;utf8,"); background-size: 10px 10px; background-position: -4px -4px; width:100%; height:100%; left:340px; transition: left 250ms} diff --git a/desktop/sources/scripts/commander.js b/desktop/sources/scripts/commander.js index b7aae9b..5dbbbf7 100644 --- a/desktop/sources/scripts/commander.js +++ b/desktop/sources/scripts/commander.js @@ -188,9 +188,9 @@ function Commander (ronin) { // Display - this.show = function () { + this.show = function (expand = false) { if (this.isVisible === true) { return } - ronin.el.className = '' + ronin.el.className = expand ? 'expand' : '' this.isVisible = true } @@ -200,9 +200,9 @@ function Commander (ronin) { this.isVisible = false } - this.toggle = function () { + this.toggle = function (expand = false) { if (this.isVisible !== true) { - this.show() + this.show(expand) } else { this.hide() } diff --git a/desktop/sources/scripts/library.js b/desktop/sources/scripts/library.js index 7bd7b3e..f15c2bd 100644 --- a/desktop/sources/scripts/library.js +++ b/desktop/sources/scripts/library.js @@ -60,6 +60,12 @@ function Library (ronin) { return rect } + // Strings + + this.concat = function (...items) { + return items.reduce((acc, item) => { return `${acc}${item}` }, '') + } + // Math this.add = (...args) => { // Adds values. @@ -319,7 +325,17 @@ function Library (ronin) { return ronin.surface.open(path) } - this.folder = (path = ronin.source.path) => { // Returns the content of a folder path. + // File System + + this.path = (path = ronin.source.path) => { // Returns the content of a folder path. + return path + } + + this.folder = (path = this.path()) => { // Returns the path of the current folder. + return require('path').dirname(path) + } + + this.ls = (path = this.folder()) => { // Returns the content of a folder path. return fs.existsSync(path) ? fs.readdirSync(path) : [] } diff --git a/examples/animate.lisp b/examples/animate.lisp index ed3eadf..4adaf64 100644 --- a/examples/animate.lisp +++ b/examples/animate.lisp @@ -1,13 +1,17 @@ ; animate - ( - (clear) - (def t (sin (div (time) 100))) - - (def pos (add 200 30 (mul 30 t))) - (defn square (a) (rect a a a a)) - (stroke (square pos) 1 "red") - + (clear) + (def t + (sin + (div + (time) 100))) + (def pos + (add 200 30 + (mul 30 t))) + (defn square + (a) + (rect a a a a)) + (stroke + (square pos) 1 "red") ; set false to stop - (animate true) -) \ No newline at end of file + (animate true)) \ No newline at end of file diff --git a/examples/fs.lisp b/examples/fs.lisp new file mode 100644 index 0000000..0c624bb --- /dev/null +++ b/examples/fs.lisp @@ -0,0 +1,11 @@ +; filesystem +( + ; get files + (def files + (ls + (folder))) + ; print files count + (echo + (concat "Current folder: " + (folder) " contains " + (len files) " files")))) \ No newline at end of file From 0f29e94ee3c05f84f24efd42693bba5debde218f Mon Sep 17 00:00:00 2001 From: Devine Lu Linvega Date: Sat, 20 Jul 2019 16:02:52 +0900 Subject: [PATCH 03/11] Updated fs example --- examples/fs.lisp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/examples/fs.lisp b/examples/fs.lisp index 0c624bb..44eac10 100644 --- a/examples/fs.lisp +++ b/examples/fs.lisp @@ -4,8 +4,11 @@ (def files (ls (folder))) - ; print files count + ; pick a random file + (def random-index + (floor + (random + (len files)))) + ; print random file name (echo - (concat "Current folder: " - (folder) " contains " - (len files) " files")))) \ No newline at end of file + (get files random-index))) \ No newline at end of file From 82080c35fd053e91db9cf1f86e36cb452533979d Mon Sep 17 00:00:00 2001 From: Devine Lu Linvega Date: Sat, 20 Jul 2019 16:16:33 +0900 Subject: [PATCH 04/11] Ported spiral --- examples/g_spiral1.lisp | 29 ----------------------------- examples/spiral.lisp | 30 ++++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 29 deletions(-) delete mode 100644 examples/g_spiral1.lisp create mode 100644 examples/spiral.lisp diff --git a/examples/g_spiral1.lisp b/examples/g_spiral1.lisp deleted file mode 100644 index 0fc82e6..0000000 --- a/examples/g_spiral1.lisp +++ /dev/null @@ -1,29 +0,0 @@ -; animated recusive spiral -; by @local_guru -( - (def start (get ronin "animate")) - (clear) - (defn rec - (v) - (if (gt v 0) - ((stroke - (circle - (add 300 - (mul (cos (add (div v 17) (div (time) 2000))) - (div v 2) - ) - ) - (add 300 - (mul (sin (div v 11)) - (div v 2) - ) - ) - (div v 2)) - 1 "rgba(255,255,255,0.1") - (rec (sub v 0.3)) - ) - ) - ) -(start) -(rec 300) -) diff --git a/examples/spiral.lisp b/examples/spiral.lisp new file mode 100644 index 0000000..d430d70 --- /dev/null +++ b/examples/spiral.lisp @@ -0,0 +1,30 @@ +; animated recusive spiral +; by @local_guru +( + (clear) + (defn rec + (v) + (if + (gt v 0) + ( + (stroke + (circle + (add 300 + (mul + (cos + (add + (div v 17) + (div + (time) 2000))) + (div v 2))) + (add 300 + (mul + (sin + (div v 11)) + (div v 2))) + (div v 2)) 1 "#fff") + (rec + (sub v 0.3))))) + ; set false to stop + (animate true) + (rec 300)) \ No newline at end of file From df3ef27625aaf0b6114c283cc27fc77ddee183cf Mon Sep 17 00:00:00 2001 From: Devine Lu Linvega Date: Sat, 20 Jul 2019 16:21:18 +0900 Subject: [PATCH 05/11] Ported spiral --- examples/spiral.lisp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/spiral.lisp b/examples/spiral.lisp index d430d70..6ca0c55 100644 --- a/examples/spiral.lisp +++ b/examples/spiral.lisp @@ -9,7 +9,7 @@ ( (stroke (circle - (add 300 + (add 375 (mul (cos (add @@ -22,7 +22,7 @@ (sin (div v 11)) (div v 2))) - (div v 2)) 1 "#fff") + (div v 2)) 1 "rgba(114,222, 194,0.1)") (rec (sub v 0.3))))) ; set false to stop From 3eb2a8a0c2f52153c6ea07ef75c0802b267324b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9Bu=20=D0=9Binve=D0=B3a?= Date: Sat, 20 Jul 2019 16:37:13 +0900 Subject: [PATCH 06/11] Update README.md --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2de1479..0f54fcb 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,13 @@ _"All I wanted, was a quick way of resizing a few photos.."_ -The application interprets a dialect of [LISP](https://en.wikipedia.org/wiki/Lisp_(programming_language)) to automate simple graphical tasks, like resizing, cropping, coloring, and generating procedural imagery. You can look at these [example files](https://github.com/hundredrabbits/Ronin/tree/master/examples) to better understand how this all works. +The application is a simple [LISP repl](https://en.wikipedia.org/wiki/Lisp_(programming_language)) to automate simple graphical tasks, like resizing, cropping, coloring, and generating procedural imagery. You can look at these [example files](https://github.com/hundredrabbits/Ronin/tree/master/examples) to better understand how this all works. + +```lisp +; draw a red square +(stroke + (rect 30 30 100 100) 2 "red") +``` ## Install & Run From 51c40b822f5fc38cb4a11ceab54c7b6e9c34b374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9Bu=20=D0=9Binve=D0=B3a?= Date: Sat, 20 Jul 2019 16:42:07 +0900 Subject: [PATCH 07/11] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0f54fcb..47e2a26 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ _"All I wanted, was a quick way of resizing a few photos.."_ -The application is a simple [LISP repl](https://en.wikipedia.org/wiki/Lisp_(programming_language)) to automate simple graphical tasks, like resizing, cropping, coloring, and generating procedural imagery. You can look at these [example files](https://github.com/hundredrabbits/Ronin/tree/master/examples) to better understand how this all works. +The application was created to automate basic graphical tasks using a dialect of [LISP](https://en.wikipedia.org/wiki/Lisp_(programming_language)), it all went south when we started adding animation tools. You can look at these [example files](https://github.com/hundredrabbits/Ronin/tree/master/examples) to better understand how this all works. ```lisp ; draw a red square From e3f1e72e961a86ba3112ce7dde762a5773ae16a0 Mon Sep 17 00:00:00 2001 From: Devine Lu Linvega Date: Sat, 20 Jul 2019 16:56:25 +0900 Subject: [PATCH 08/11] Fixed issue with mouse click erasing main canvas --- desktop/sources/scripts/commander.js | 36 ++++++++++++++++------------ desktop/sources/scripts/surface.js | 9 +++---- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/desktop/sources/scripts/commander.js b/desktop/sources/scripts/commander.js index 5dbbbf7..95892a5 100644 --- a/desktop/sources/scripts/commander.js +++ b/desktop/sources/scripts/commander.js @@ -105,37 +105,43 @@ function Commander (ronin) { this.onMouseDown = (e) => { this.mouseDown = true - this.mouseRect.x = e.offsetX - this.mouseRect.y = e.offsetY - this.mouseRect.a.x = e.offsetX - this.mouseRect.a.y = e.offsetY + const offset = this.makeMouseOffset({ x: e.offsetX, y: e.offsetY }) + this.mouseRect.x = offset.x + this.mouseRect.y = offset.y + this.mouseRect.a.x = offset.x + this.mouseRect.a.y = offset.y this.mouseRect.t = 'pos' this.capture() this.show() } this.onMouseMove = (e) => { - if (this.mouseDown === true) { - this.mouseRect.w = e.offsetX - this.mouseRect.x - this.mouseRect.h = e.offsetY - this.mouseRect.y - this.mouseRect.b.x = e.offsetX - this.mouseRect.b.y = e.offsetY - this.commit() - } + if (this.mouseDown !== true) { return } + const offset = this.makeMouseOffset({ x: e.offsetX, y: e.offsetY }) + this.mouseRect.w = offset.x - this.mouseRect.x + this.mouseRect.h = offset.y - this.mouseRect.y + this.mouseRect.b.x = offset.x + this.mouseRect.b.y = offset.y + this.commit() } this.onMouseUp = (e) => { this.mouseDown = false - this.mouseRect.w = e.offsetX - this.mouseRect.x - this.mouseRect.h = e.offsetY - this.mouseRect.y - this.mouseRect.b.x = e.offsetX - this.mouseRect.b.y = e.offsetY + const offset = this.makeMouseOffset({ x: e.offsetX, y: e.offsetY }) + this.mouseRect.w = offset.x - this.mouseRect.x + this.mouseRect.h = offset.y - this.mouseRect.y + this.mouseRect.b.x = offset.x + this.mouseRect.b.y = offset.y this.mouseRect.t = '' this.commit() this._input.focus() ronin.surface.clearGuide() } + this.makeMouseOffset = (pos) => { + return { x: pos.x * ronin.surface.ratio, y: pos.y * ronin.surface.ratio } + } + // Injection this.cache = '' diff --git a/desktop/sources/scripts/surface.js b/desktop/sources/scripts/surface.js index 36ab155..b2ee463 100644 --- a/desktop/sources/scripts/surface.js +++ b/desktop/sources/scripts/surface.js @@ -6,7 +6,7 @@ function Surface (ronin) { this.ratio = window.devicePixelRatio // Contexts this.context = this.el.getContext('2d') - this.guide = this.el.getContext('2d') + this.guide = this._guide.getContext('2d') this.install = function (host) { host.appendChild(this.el) @@ -15,9 +15,6 @@ function Surface (ronin) { this._guide.addEventListener('mousedown', ronin.commander.onMouseDown, false) this._guide.addEventListener('mousemove', ronin.commander.onMouseMove, false) this._guide.addEventListener('mouseup', ronin.commander.onMouseUp, false) - // this.context.imageSmoothingEnabled = false - this.context.scale(this.ratio, this.ratio) - this.guide.scale(this.ratio, this.ratio) } this.start = function () { @@ -151,8 +148,8 @@ function Surface (ronin) { context.clearRect(rect.x, rect.y, rect.w, rect.h) } - this.clearGuide = function () { - this.clear(ronin.surface.getFrame(), ronin.surface.guide) + this.clearGuide = function (rect = this.getFrame(), context = this.guide) { + context.clearRect(rect.x, rect.y, rect.w, rect.h) } this.clone = function (a, b) { From b81c30be4830ae94a8506529efc12ea72c544fea Mon Sep 17 00:00:00 2001 From: Devine Lu Linvega Date: Sat, 20 Jul 2019 16:58:20 +0900 Subject: [PATCH 09/11] Removed console --- desktop/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/main.js b/desktop/main.js index 5201349..33934bd 100644 --- a/desktop/main.js +++ b/desktop/main.js @@ -23,7 +23,7 @@ app.on('ready', () => { }) app.win.loadURL(`file://${__dirname}/sources/index.html`) - app.inspect() + // app.inspect() app.win.on('closed', () => { win = null From 3e9cb56089e15cdd6522f8c62d783ceae5ae9c94 Mon Sep 17 00:00:00 2001 From: Devine Lu Linvega Date: Sat, 20 Jul 2019 17:01:12 +0900 Subject: [PATCH 10/11] Updated library --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 47e2a26..ce45dda 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ npm start - `(stroke ~shape)` Strokes a shape. - `(fill ~rect)` Fills a shape. - `(clear ~rect)` Clears a rect. +- `(concat ...items)` - `(add ...args)` Adds values. - `(sub ...args)` Subtracts values. - `(mul ...args)` Multiplies values. @@ -60,7 +61,7 @@ npm start - `(or a b ...rest)` Returns true if at least one condition is true. - `(map fn arr)` - `(filter fn arr)` -- `(reduce fn arr ~acc)` +- `(reduce fn arr acc)` - `(len item)` Returns the length of a list. - `(first arr)` Returns the first item of a list. - `(last arr)` Returns the last @@ -72,7 +73,7 @@ npm start - `(frame)` Returns a rect of the frame. - `(center)` Returns a position of the center of the frame. - `(scale rect w h)` -- `(resize w h)` 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. - `(crop rect)` - `(clone a b)` @@ -84,12 +85,15 @@ npm start - `(echo ...args)` - `(str ...args)` - `(open path)` Imports a graphic file and resizes the frame. -- `(folder ~path)` Returns the content of a folder path. +- `(path ~path)` Returns the content of a folder path. +- `(folder ~path)` Returns the path of the current folder. +- `(ls ~path)` Returns the content of a folder path. - `(exit ~force)` Exits Ronin. - `(time)` Returns timestamp in milliseconds. - `(animate ~play)` Toggles animation. - `(js)` Javascript interop. - `(test name a b)` +- `(benchmark fn)` logs time taken to execute a function ## Extras From 1e245e144e79a387d5ddf0a9b50a06b847b428bc Mon Sep 17 00:00:00 2001 From: Devine Lu Linvega Date: Sat, 20 Jul 2019 17:33:42 +0900 Subject: [PATCH 11/11] * --- README.md | 7 +- desktop/sources/scripts/library.js | 14 ++- documentation.md | 159 ----------------------------- examples/fs.lisp | 4 +- 4 files changed, 15 insertions(+), 169 deletions(-) delete mode 100644 documentation.md diff --git a/README.md b/README.md index ce45dda..1f1aa21 100644 --- a/README.md +++ b/README.md @@ -85,9 +85,10 @@ npm start - `(echo ...args)` - `(str ...args)` - `(open path)` Imports a graphic file and resizes the frame. -- `(path ~path)` Returns the content of a folder path. -- `(folder ~path)` Returns the path of the current folder. -- `(ls ~path)` Returns the content of a folder path. +- `(dir ~path)` Returns the content of a directory. +- `(file ~path)` Returns the content of a file +- `(dirpath ~path)` Returns the path of a directory. +- `(filepath ~path)` Returns the path of a file - `(exit ~force)` Exits Ronin. - `(time)` Returns timestamp in milliseconds. - `(animate ~play)` Toggles animation. diff --git a/desktop/sources/scripts/library.js b/desktop/sources/scripts/library.js index f15c2bd..ea3483a 100644 --- a/desktop/sources/scripts/library.js +++ b/desktop/sources/scripts/library.js @@ -324,18 +324,22 @@ function Library (ronin) { this.open = async (path) => { // Imports a graphic file and resizes the frame. return ronin.surface.open(path) } - + // File System - this.path = (path = ronin.source.path) => { // Returns the content of a folder path. - return path + this.dir = (path = ronin.source.path) => { // Returns the content of a directory. + return fs.existsSync(path) ? fs.readdirSync(path) : [] } - this.folder = (path = this.path()) => { // Returns the path of the current folder. + this.file = (path = ronin.source.path) => { // Returns the content of a file + return fs.existsSync(path) ? fs.readFileSync(p, 'utf8') : '' + } + + this.dirpath = (path = ronin.source.path) => { // Returns the path of a directory. return require('path').dirname(path) } - this.ls = (path = this.folder()) => { // Returns the content of a folder path. + this.filepath = (path = ronin.source.path) => { // Returns the path of a file return fs.existsSync(path) ? fs.readdirSync(path) : [] } diff --git a/documentation.md b/documentation.md deleted file mode 100644 index 706fee5..0000000 --- a/documentation.md +++ /dev/null @@ -1,159 +0,0 @@ -# Functions - -## IO - -`(open path)` - -`(export path type quality)` - -`(draw path rect)` - -`(resize width height)` - -`(crop rect)` - -`(folder path)` - -`(exit)` - -## Logic - -`(gt a b)` check if `a` is greater than `b` - -`(lt a b)` check if `a` is lower than `b` - -`(eq a b)` check if `a` is equal to `b` - -`(and a b )` returns true if all conditions are true - -`(or a b )` returns true if at least one condition is true - -## Arrays - -`(map function array)` - -`(filter function array)` - -`(reduce function array accumulator)` - -`(len array)` - -`(first array)` - -`(last array)` - -`(rest array)` - -`(range start end step)` - -## Shapes - -`(pos x y)` - -`(size w h)` - -`(rect x y w h t)` - -`(circle x y r)` - -`(line start end)` - -`(text x y g string font)` - -`(svg data)` - -## Helpers - -`(frame)` - -`(center)` - -`(scale rect width height)` - -## Copy/Paste - -`(clone start end)` clone start `rect` into end `rect` - -`(stroke shape thickness color)` - -`(fill shape color)` - -`(clear shape)` - -## Objects - -`(get item key )` - -`(set item key val)` - -## Colors - -`(theme variable)` - -`(gradient (x1,y1,x2,y2) colors)` - -`(pixels rect function q)` - -`(saturation pixel q)` - -`(contrast pixel q)` - -## Math - -`(add ...values)` - -`(sub...values)` - -`(mul ...values)` - -`(div ...values)` - -`(mod a b)` - -`(clamp value min max)` - -`(step value step)` - -`(min a b)` - -`(max a b)` - -`(ceil value)` - -`(floor value)` - -`(sin a)` - -`(cos a)` - -`PI, TWO_PI` - -`(random)` - -`(random start end)` - -`(random max)` - -## Generics - -`(echo args)` - -`(str args)` - -`(test name value expectedValue)` - -## Livecoding - -`(time)` returns timestamp in milliseconds - -`(animate)` start animation - -`(animate false)` stop animation - -## Javascript interop - -`js` - -## Client - -`ronin` diff --git a/examples/fs.lisp b/examples/fs.lisp index 44eac10..b63101e 100644 --- a/examples/fs.lisp +++ b/examples/fs.lisp @@ -2,8 +2,8 @@ ( ; get files (def files - (ls - (folder))) + (dir + (dirpath))) ; pick a random file (def random-index (floor