DACTAL.org
dactal.org
DACTAL.org
@dactal.org
A notional organization for an experimental query language.
You have a rack with no good Scrabble plays. Which tile is the best to unload?

Here's that question asked in DACTAL.
November 5, 2025 at 12:25 AM
Structurally tiny but useful addition. Inverting a graph arc can now be done like this:

.inverse name>forward property

E.g., in data where each album has track objects, but the tracks don't refer back to their album:

.album>tracks

adds an "album" property to each track while traversing.
November 3, 2025 at 11:24 PM
Tiny additions. Filtering items that have any, or no, values for a property can now be done with:

:property+
:property-

as shorthand for the subquery forms:

:(.property)
:-(.property)

But the subquery forms are still needed for any path more complicated than a single property.
November 3, 2025 at 11:20 PM
I should pretend I designed this feature intentionally, but in reality I just realized that because

something/someprop.10

gives us the first 10 items from each group, you can also truncate each group to 10 items in place, like this:

something/someprop|of=10
October 8, 2025 at 5:47 PM
The Gallery now includes a DACTAL Sudoku solver! Or, more accurately, a Sudoku solution-process revealer.

dactal.org/dactal.html?...
October 2, 2025 at 4:14 PM
This may not interest you until you suddenly hit a case where you need it, but you can now short-circuit a traverse operation when it gets its first results, like this:

some data.<(.some expensive subquery)

instead of running the subquery N times only to throw away N-1 of the results.
October 1, 2025 at 4:03 PM
DACTAL,ATProto.fun
BlueSky is not just an app, it's an experiment in public data, but the experiment is hidden under a normal-looking app that doesn't really give you different powers than you have elsewhere.

If you're curious to see under this surface, I made a thing to help.

Explained here: furia.com/log/518
September 17, 2025 at 4:01 PM
A start/labeling operation can append to the existing list with

?label=+(subquery)
??label=+(subquery)

And a start operation can use the value ONLY as a reference with

=label
=type

Thus this form for setting a label if it isn't already set:

??district size=(=district size;~1000)
August 30, 2025 at 2:01 PM
Sometimes you want (or just need) the results of another query in the middle of the one you're writing. Highlight the subquery and hit Command-U to unpack it.
August 27, 2025 at 3:08 PM
Saved relative queries let you encapsulate complexity, like

AEIODLT
.possible words
.by added letter

And now you can decapsulate it again with command-I (for Inline).
August 22, 2025 at 3:36 PM
Also: added regex filtering. And then, only a little later, added documentation of regex filtering.
August 16, 2025 at 12:52 AM
If anybody can vibe-code embryonic ideas into slick apps, we're gonna get a lot of slick apps sealed airlessly around ideas that never got a chance to become.

I want the opposite of that, unslick explorers of exposed exologic. We only start at the beginning.

dactal.org/Scrabble.html
August 15, 2025 at 6:37 PM
Yesterday's excellent tiny realization: subtractive traversal is a set-disjunction operation, but subtractive traversal with duplicates is itemwise removal.

...x=(1,1,2,2,3,3),y=(2)
.x,-y → 1,3
..x,y → 1,1,2,3,3
August 8, 2025 at 1:52 PM
August 1, 2025 at 7:13 PM
On one hand, we already know all the prime numbers below 1000.

On the other, here's the Sieve of Eratosthenes in a DACTAL query.

dactal.org/dactal.html?...
DACTAL
dactal.org
August 1, 2025 at 4:52 PM
I give you your carets back. ^ and ^^ for comments have been replaced by ??? for notes, so ^ is no longer a reserved character.

??? your notes here

Notes in DACTAL are a null operation, not meta-text, which has some cool implications that I haven't thought of yet.
July 31, 2025 at 8:43 PM
I moved the inline-math handling to a more sensible place in the resolution process, so now you can use it in traversal, grouping, sorting, or either form of annotation.
July 25, 2025 at 3:41 PM
Realized and fixed an early-implementation laziness that evaluated :x=y as :(.x:@1:=y) instead of :(.x:=y)
July 23, 2025 at 6:07 PM
Oh look, a Wordle solver that fits (kinda) in a URL.

dactal.org/dactal.html?...
DACTAL
dactal.org
July 18, 2025 at 5:53 PM
To go with /@x, which groups consecutive sequences with shared x properties, you can now also do /@@y to group sequences that start with each occurrence of y.

E.g grouping streams into listening sessions broken by gaps of more than 10 minutes between songs:
July 18, 2025 at 2:16 AM
Realized that the recently-added |x@ shortcut, for annotating a list of items with their list indexes, was actually the beginning of the missing feature for doing running ranks/counts/totals.

e.g. cumulative duration:

tracks2||cumulative duration=@@duration

dactal.org/dactal.html#...
DACTAL
dactal.org
July 10, 2025 at 3:25 PM
Huh, worked out the Wordle logic in DACTAL form.
July 4, 2025 at 9:29 PM
The new ?? label operation has the same labeling options as a ? start operation, but relative to, and without changing, the current list:

tracks|others=(??this .artist.tracks:-(this))

This replaces the more limited special-casing of "=_" in starts:

tracks|others=(?this=_ .artist.tracks:-(this))
June 28, 2025 at 3:26 PM
Today in obsessive buffing of rough spots:

Filter negation is now done with -, instead of !.

tracks:-=Amaranth

This was the only use of ! as a suboperator, which frees it up to be the repeat operator, instead of ??.

messages._,replies!
June 19, 2025 at 5:19 PM
Reposted by DACTAL.org
Today's tiny DACTAL tweak that probably affects nobody: in an aggregation, semicolons explicitly identify aggregators. So this query is a count of counts; the first "count" is a property (of groups), the second "count" is the aggregator.

tracks/artist...count;count
June 18, 2025 at 8:49 PM