Call dseams from Fennel#

Problem#

You want lisp syntax on the same library a Lua script loads with require("dseams"). No yodaStruct binary. No YAML config.

Paths#

Meson, from the repository root:

meson setup bbdir --wrap-mode=nofallback
meson compile -C bbdir
export LUA_PATH="$PWD/lua/?.lua;;"
export LUA_CPATH="$PWD/bbdir/?.so;;"

Nix sets the same two variables to the installed library:

nix develop

The vendored compiler lives at src/include/external/fennel/fennel.lua. A meson install puts a copy at $prefix/share/luadseams/fennel.lua. Invoke it as a Lua script. It already puts fennel on package.loaded.

(require :dseams)#

The library example lives at example_lua/library/chill.fnl:

(local dseams (require :dseams))
(local cloud (dseams.read "input/traj/exampleTraj.lammpstrj" {:type 2}))
(assert (> cloud.nop 0))
(local types (dseams.chill_plus cloud {:cutoff 3.5 :type 2}))
(print (string.format "dseams_fnl nop=%d ntypes=%d" cloud.nop (length types)))

Run it from the repository root:

lua src/include/external/fennel/fennel.lua example_lua/library/chill.fnl

Fennel require falls through to Lua package.path, so (require :dseams) returns the same table as require("dseams"): read, neighbors, knn, chill_plus, chill, cages, and .core. Names stay snake_case.

Scripts that mention readFrameOnlyOne, functionScript, or trajectory as a global expect the 2020 driver. Rewrite them to (require :dseams). example_lua/fennel/script.fnl is that older shape.

lua/dseams.fnl#

lua/dseams.fnl wraps that table with kebab-case names (chill-plus) and re-exports .core. Load it with fennel.dofile under a name that is not dseams, so the inner (require :dseams) still hits the Lua module:

(local fennel (require :fennel))
(local dseams (fennel.dofile "lua/dseams.fnl"))
(local cloud (dseams.read "input/traj/exampleTraj.lammpstrj" {:type 2}))
(print (dseams.chill-plus cloud {:cutoff 3.5 :type 2}))

Putting lua/?.fnl on fennel.path and then (require :dseams) would compile dseams.fnl as dseams and load that file as itself. Do not do that.

meson installs dseams.fnl next to dseams.lua under share/luadseams/lua/. Nix does not symlink it into the versioned share/lua/ tree. After meson install, pass the installed path to fennel.dofile.

(require :yoda) aliases the Lua module. Prefer (require :dseams).

See also#