Saw #14: Guards, Lints, Macros as a Test Bench, and Blender Software developer Michael Wright released X_eTaL Saw #14, adding a `xetal lint` linter with three initial checks and a Blender extension that lets X_eTaL programs generate the Python Blender runs in the background. The update also codifies a rule that new X_eTaL language features be prototyped as macros first, with the Tags macro library implementing records and named choices and two existing macro libraries generating neural networks and native-extension facades. Blog publishing now enforces conflict-marker, thumbnail and JuliaMono font checks via git hooks and site validation. Saw 14: Guards, Lints, Macros as a Test Bench, and Blender 986 words • 5 min read • Abstract | Resource | Link | |---|---| | X eTaL | the language https://github.com/softwarewrighter/X eTaL — xetal doc and xetal lint | | Tags | X eTaL-libraries: Tags https://github.com/softwarewrighter/X eTaL-libraries/tree/main/libs/Tags — named choices and tagged tuples, as macros only | | Blender | X eTaL-extensions: blender https://github.com/softwarewrighter/X eTaL-extensions/tree/main/extensions/blender — X eTaL writes the Python that runs Blender | | The series | Array Languages 1 https://blog.softwarewrighter.com/2026/10/07/array-languages-xetal/ through 5 https://blog.softwarewrighter.com/2026/10/11/array-languages-xetal-ml/ | | Comments | Discord https://discord.com/invite/Ctzk5uHggZ | Guards on the blog Publishing every day for a week showed where the blog needed checks rather than care: - No conflict markers, ever. Carrying a fix from the drafts branch to the published one ran into merge conflicts. None reached the site, but only a manual check stood in the way. Now a script refuses conflict markers and unmerged files, and git hooks run it before every commit and every push, as does the validation that publishing runs. - Thumbnails and lead images checked. Every post leads with its own image, and validation fails on a duplicate. A new check builds the site and confirms that each card on the abstracts page shows the same image as its post, light and dark versions included. - One font for code. Every code sample on the site, past and future, is drawn in JuliaMono, served from the blog itself. It covers every APL and X eTaL symbol, and a small script rebuilds it when a post needs a character it lacks. Two tools in the language - xetal doc , the cross-reference. It builds a searchable site from a program and everything it imports, every call linked to its definition and every function findable by its type. The X eTaL repositories publish one beside their demos. Array Languages 3 https://blog.softwarewrighter.com/2026/10/09/array-languages-xetal-libraries/ has the details. - xetal lint , new this week. A linter in the spirit of Rust’s clippy: a catalog of lints in groups, each with an explanation, and levels set in the source with lint: comments. The first lints check names against the style guide, flag a binding that is never used, and check that a function’s name ends in exactly when the function has an effect. The language’s own libraries and demos were cleaned up to pass it. Macros as the test bench The bigger change is a rule. X eTaL should stay small, so a new language feature is tried as a macro first, and the grammar changes only when a change is justified. Three experiments are running that way: - Records and choices. A proposal for records and named choices starts from what records are for: reading parts by name, adding a part safely, updating one part, and keeping a State from passing as a Config . Its first option is built as a macro library, Tags, to try. One line, "Color: black red green" , writes a constant per choice; another, "State: w m v k" , writes a constructor, a test, and a getter and setter per part. Nothing is added to the language. - Math equations for ML. Macros that take an equation, starting with the convolution’s triple sum, and give back math notation, the array code it expands to, and a computation that runs. Array Languages 5 https://blog.softwarewrighter.com/2026/10/11/array-languages-xetal-ml/ says more. - Networks and native bindings. Two macro libraries already in use show the pattern works: one writes a neural network and its training step from a line, and another writes every native extension’s typed facade. Looking ahead: Blender New this weekend: a Blender extension. An X eTaL program writes Python twice over, a launcher and the script Blender runs inside, and the extension runs it with Blender in the background, under a timeout, and reports what happened. A library on top of it, also done, writes that Python from arrays. Cubes become one mesh whose corners and faces are worked out as X eTaL arrays. It adds 3D labels, a sun and a sky, and a camera on a pivot that turns once, evenly, so a video loops. Blender’s EEVEE renders it, and the scene comes out as PNG stills, an MP4 and .glb , .obj and .blend files. The video here is the first run of the demo that comes next: one cube, a slab of 100 and a block of 1,000. The block’s mesh alone has 8,000 vertices. After that come more advanced meshes and effects. That makes 3D scene generation, animation and rendering something an array program can do, and that will be useful well beyond one demo. Other things set up this week that will pay off later: the native hook X eTaL still needs, so extensions can drop their bridge; worked examples under every library function that xetal doc can run and check; and the equation-macro proof of concept. Part 14 of the Sharpen the Saw Sundays series. View all parts https://blog.softwarewrighter.com/series/ sharpen-the-saw-sundays Comments or questions? SW Lab Discord https://discord.com/invite/Ctzk5uHggZ or YouTube @SoftwareWrighter https://www.youtube.com/@SoftwareWrighter .