Iron ChIF: Pilot Episode (Pacian vs. Draconis, using Dialog)

I grinned like mad when I read the notebook.

An arrow just pointing to “SHENANIGANS” has to be the tersest yet most excitingly promising summary for a game!

It’s already telling a lot about the mindset of the author who begins to plan the game to come. Will there be “DRAMA” ? No. Then maybe “COMBAT” ? No. Perhaps there will be “MUSINGS ABOUT THE CONDITION HUMAINE” ? No.

No, no, no.

But by Jove there will be shenanigans!

And listening to the narrator’s words, which I interpret here as the inner monologue of the PC, the tone of the game will accommodate many and much shenanigans…

This first nibble tastes good.



Gesundheit.

11 Likes

“They don’t realize one of them is an interdimensional spider” has to be the most intriguing setup. How do they not realize? Are they blind? Does the spider wear a disguise? How good could such a disguise be? Thankfully it is circled with an arrow saying “Keep this bit,” so likely we’ll find out.

Can’t say I’ve ever had spider cake before, and I am arachnophobic, but I hear that adding thingies to spiders makes them taste like chocolate, so I’m hopeful. Pardon me as I avert my eyes while the chIF chops them.

This is going to be fun, as long as I don’t have a heart attack when I realize one of my fellow judges has been an interdimensional spider all along.

11 Likes

Four of its legs are left dangling in a parallel dimension, of course. The rest of it wears a Spiderman™ costume day and night and claims to be method-acting to prepare for the next ComicCon.

9 Likes

Now of course, if I want to do a language puzzle…then I’m going to need a language.

Not much of a language. Just enough to make the puzzles work. 20 words or so, and basic grammar. But still! How does one even get started on any of that? And this is where we get into the fun of conlanging![1]

I’ll be keeping the grammar a secret for the moment. But still, coming up with 20 words of vocabulary is hard, especially for someone like me who struggles to name anything! I could just grab some Sumerian words, nobody’s likely to recognize those, but I want this alien language to look alien—not too alien to pronounce, just alien enough to feel weird. (Plus, someone actually pulled up an Akkadian dictionary and grammar to decipher the “Kishadu” dialogue in Death on the Stormrider.)

So when I need a bunch of words with a consistent aesthetic, I turn to context-free grammars. A CFG is basically a series of rules that says “when you have an X, you can turn it into a Y or a Z”. They’re generally used to recognize patterns rather than generate them, but by adding a bit of dice-rolling, they work just as well for generating too.

For example, let’s say I wanted to generate a bunch of nonsense words that look like Japanese. A syllable in Japanese consists of four parts:

  • An initial consonant (optional)
  • A y sound after the initial consonant (optional)
  • A long or short vowel (required)
  • A final n (optional)[2]

We can encode that in a context-free grammar like this:[3]

# A syllable has four parts
S : CYVN

# 0 stands for "nothing here"
C : p b t d k g s z h r 0

# Let's make "nothing" be twice as common as "y"
Y : y 0 0

# And short vowels twice as common as long ones
# (S is already taken, so short is H)
V : L H H
L : aa ei ii ou uu
H : a e i o u

# Similarly, "nothing" twice as common as "n"
N : n 0 0

# Finally, a word will be some pattern of syllables
# Let's use a bell curve
@ : S SS SS SSS SSS SSS SSSS SSSS SSSSS

Now, we start with “@”. At every step, we go through our string, look for any character that appears on the left side of a rule, and replace it with a random result from the right side. So over a few steps:

@
SS
CYVNCYVN
t0ounkyaa0
tounkyaa

And if we run this a bunch of times:

gokyo hiinhuguunkya zin kyunrihin dibukyigounkyiin pipuu syeinbyin ontehu tyanzaa sanzeitu hounduuzei pyukyo uukanbyun zinbei hodeizin roobya giinzinheyi zyuubeto yonzya pyan raenru huyagon buzison

Reasonably Japanese-looking nonsense! This could be improved by running a few replacements on the result—for example, hu in Japanese is actually pronounced fu, di is pronounced ji, yi is forbidden, and so on—and the probabilities are way off. But I think people would agree that words like zinbei sanzeitu pyan gokyo have a Japanese look to them, even if they’re meaningless gibberish.

And this sort of thing turns out to be very useful when you’re making up a language—or even just a handful of names. It’s quite handy when building a D&D campaign to have names from the Tphaki region look like apsheksha ophe okkhepshema enopho esapkhe i pphatepkhomisho thomathiphi tshepho while the dwarves’ names look like pazam qidtupir p’r anpi ku palirpud tiinquz ulk’ azka kitim titumpa. So a few years back I wrote a simple Python program that takes a grammar like this and produces a long stream of nonsense from it.

(The program is actually a bit more powerful than a CFG: it can run replacements on the result, like turning di into ji in Japanese, or eliminate any words where certain sequences appear, like yi. At some point I’ll document it well enough to toss up on Bitbucket.)

To make this language sound alien, I’m removing a bunch of sounds that are possible in human languages.[4] These aliens don’t have noses, so they can’t make nasal sounds like m or n, and their larynx doesn’t have cricoarytenoid muscles like ours does, so they can’t make voiceless sounds (sounds where the vocal cords are left slack and don’t vibrate), like s or k. To compensate for the loss, I’ll throw in a couple sounds that English doesn’t have, but which English-speaking readers can easily imagine, like gh and q.[5]

# Curve of syllable distributions
@ : IF IF ISF ISF ISSF ISSSF

# Initial syllables can lack onsets, sometimes
I : S S V
# Medial syllables are onset-nucleus
S : ON
# Final syllables are either that or onset-nucleus-consonant
F: S ONC
# Onsets are either a consonant or an R-compatible consonant plus r
O: C C C Rr
# Nuclei are either a vowel or a vowel plus a glide
N : V V YV
Y : u i
V : a e o
# And now our consonant inventory: voiced stops and fricatives only
C : b d j g q v z zh gh l r
# R-compatible consonants: don't allow lr, jr, etc
R : b d g q z

The result?

dezhog eduobio ozioved vuodroqio qrozioqruega luezoze ziezholiob aviazrazelue qroqrie aqria zhezhuo oqred godruoroj giejuajiequazh luaqroraquoq quoqoboq ejiorie zobejieb aquaze buazovueb ojorod eghiad odradreborie luavad zhuabebuezro eqrojav zruelo ezuoq azazhagh abrelo egoqrogiobag ojueva logreghia gheqobraqrelo abrej zhazruezhev zravabeb ghieqovajogh zhozrogedav gueqale logruaq eqrog ojazabadre aghuaghuezriada ejajiogro gobiaghua abiol rajabuebruogheq edrodred ghuazaziodezoz baquel riejor vegedrarazrazh

I only need like 20 or so good ones, so it’s okay if the CFG also produces some bad ones. From this batch I might grab dezhog, aqria, zhezhuo, oqred, ojorod, eghiad, zruelo, ezuoq, logruaq, or abiol as particularly nice-looking. If I cared about fine-tuning this, I’d notice that it’s producing a lot of intimidatingly long words, and reduce the number of syllables in the first line of the grammar. But I don’t. I’m not likely to be using it again after today.

And voilà! Alien words!

Drela oraqe adruagria zhozozra. Oziaz vozrazalio ghiadar zevogh doqradab. Viabrieve obegh biagev. Zhozregrua!

Now all I have to do is pick a handful of favorites, adjust them to my liking, ensure they look distinct enough that people won’t get confused between them, and a language is born! Let’s call it, uh…

Zhozrogedav

That sounds good. Let’s go with that.


  1. “Conlang” = constructed language, a language invented rather than naturally evolved. ↩︎

  2. Or a final sokuon, but I’m ignoring that for this example. ↩︎

  3. Using my own custom syntax. You’ll get used to it. ↩︎

  4. The alternative, adding sounds that are impossible for humans, would be rather counterproductive! Who’s going to know how to pronounce ƍ or ¢? ↩︎

  5. Phonetically speaking, gh is supposed to be ɣ, q is supposed to be ɢ, and r is supposed to be ʁ. But this matters not at all. Most people will only be hearing these words in their imaginations, after all! ↩︎

21 Likes

Well, the first one (which would be pronounced “jinbei”) is the Japanese word for whale shark! (Yes, “di” and “zi” are both pronounced “ji”—at least in most dialects, including the “standard” one.) But with a limited phonemic inventory and a lot of rules about what sounds can go where you’re bound to happen on some real words while randomly generating plausible ones.

Anyway, I’ve been busy today, but it’s cool to come back and see all of this stuff brewing! I’m also intrigued by the secret interdimensional spider—truly a bold ingredient choice, but I would expect no less from this challenger.

10 Likes

(from the judge’s viewing box)

Right, we’re certainly seeing the contrast of approaches between these two that we might have expected, but I had no idea it would be this crystalline.

Draconis’s first offerings

Language is Draconis’s area of specialty, and Draconis is giving us a direct window to their incredibly methodical and learned approach to the subject with their first day’s offerings – and apparently building a real language system. I honestly did not expect to see this level of detail from either chif at this stage of competition; I figured both would be too busy. I think the choice of the language-based seed plus this work is making Draconis look really dangerous out of the gate.

Now also, I heard a rumour that Draconis may not even be looking at their opponent’s posts during this competition. That they might have blocked their opponent on Discourse. That would show they’re definitely playing their own game and have a lot of confidence in it…

Pacian’s first offerings

… and that might be a good strategy for Draconis when what we first see from Pacian is the start of the freewheeling (and potentially bamboozling to an opponent) associative approach we – or at least I – probably hoped for. I agree with my comrades; Pacian’s already landing some big hits of humour-mischief-mystery just at the notebook stage with his ‘Shenanigans’ and possible-interdimensional-spider jottings, with the caveat that this is early cooking so I’m definitely not holding him to the spider idea.

Our first look at some Dialog code from a competitor - from Pacian - I found to be quite followable only after one lesson from @improvmonster (our Fukuisan) when accompanied by Pacian’s comments. And the sample game output looks very good.

-Wade

14 Likes

A lot to catch up on – a wonderfully enticing special ingredient, and neither of our competitors is wasting much time!

Mysterious messages from an alien object are a sci-fi classic for a reason, and they come in a lot of flavors. The monoliths from 2001 are probably the ur-example, bootstrapping human evolution through the stress of their regard (and the non-diegetic classical music that accompanies them); their descendants can lean arty, like the mirrors in Story of Your Life/Arrival, or pulpy, like the psychic pylons in Mass Effect. I’d note that the artier ones often focus on the form of the message, using the effort of translation to unpack some essential difference of perspective the aliens bring to bear, whereas the pulpier ones care more about the content, as the dire warnings or vague prophecies they carry often help move the plot into motion. Either can work, of course, but as we see what our chefs are preparing, I’ll be curious about the presentation of both the how and the what of the messages.

(As long as we’re talking about the antecedents of the trope, it’s worth noting that both of our competitors appear to have leapt to non-terrestrial languages, not just non-human ones – a logical shift, but I do have a soft spot for Star Trek IV, where a space probe comes to Earth and starts broadcasting to humpback whales, since clearly humans aren’t the ones worth talking to here).

As for what they are doing – well, as predicted, our Iron ChIF has a bevy of tools right at hand for an ingredient that couldn’t be more perfectly suited to them (the fact that Pacian didn’t veto the linguistics ingredient when up against a linguist is surely either bravado or hubris!) As Wade says, while I’m not exactly surprised at the systematic approach to language construction Draconis has deployed, I’m definitely impressed by the kinda-Russian, kinda-Italian melange they’ve developed. It appears there’ll be some rigor here, and puzzle-solving will likely require some inductive as well as deductive reasoning – I’m looking forward to a brain-workout when the meal is completed (and, er, hopefully some hints if things get too tough?)

As for our incumbent champion’s invocation of Chants of Senaar, I admit I haven’t played it, but my vague knowledge of the plot does remind me that all our stories about the challenges of being understood across distance, identity, and culture are downstream of the Tower of Babel. No pressure, chefs, it’s just that your dishes should bridge us towards the divine!

But as mentioned, Pacian doesn’t seem to be feeling the pressure. Besides acceding to an ingredient that might build on Draconis’s home-court advantage, our challenger is also taking the time to doodle and brainstorm and make jokes in his notes to himself, which I can certainly relate to. Again, it’s not surprising that he’s landed on a limited-parser game, with the choice of allowing only one verb meaning that interactivity seems like it will revolve exclusively around the nouns. Typically, the ways to make puzzles work in such an interface rely on timing and path-dependence, so that the player can’t simply lawn-mower their way to victory, though the language aspect also suggests that the player might need to figure out some translations to proceed. While we’ve seen a lot of the design process, as well as the code setting up the core gameplay system, there are still a lot of questions about how it will all come together – we’ll all be expecting someone to be the interdimensional spider, but I think Pacian will still manage to make the eventual reveal a surprise!

14 Likes

Hey! Leave some for me! I haven’t had any breakfast yet!

----jumps out of the makeshift bed constructed from bags of flour and salt and rice----starts running----halts, turns, carefully folds Grue-embroidered blanky----starts running again----devours @draconis tasting plate----looks amazed when the whole plate fills up again----

Oh…right… That’s the amazing thing about language and ideas… You can share them without using them up.

Draconis’ focused and methodical approach to producing gibberish smells and tastes a bit like poledwiczki volove. Indeed, if I hadn’t read about the vocab-cooking techniques they used, I would have imagined myself in Poland, or some other Eastern European kitchen.

Which makes me wonder: how many of the nonsense words coming out of Draconis’ steaming pots are unintentionally real words in a real language somewhere? Apparently, according to @EJoyce, they already cooked up a whale shark without meaning to… (Imagine the jinbei’s surprise when it got dumped into a sizzling pan the size of a swimming pool…)

Wouldn’t want our alien machine going around bellowing “Lick my hairy whale shark balls!” in the local dialect, would we? No, that would be offensive to the local whale sharks, who insist on waxing their balls at least weekly.

Zhozrogedav indeed!

13 Likes

A little bug fix before work: the stranger wasn’t actually putting anything down! In fact, rather than littering the floor, perhaps he should put everything in his pocket, which will help to draw the player’s attention to an important item in there that sets up the premise…

    (if)(item $obj)(then)
        The stranger
        %% first put down anything already held
        (if)($item is #heldby #Stranger)(item $item)(then)
            (now)($item is #in #StrangerPocket)
            puts (the $item) in his pocket and
        (endif)
        picks up (the $obj).
        (now)($obj is #heldby #Stranger)
    (endif)

Then we can make sure those things show up in the room description with a whole dollop of graceless coding…

#AncientSanctum
(room *)
(name *) Ancient Sanctum \(tied to the stranger\)
(look *)
    (select)
    So this is where the unlikely trio have been journeying towards all this time: a
    (or)
    A
    (stopping)
    cavernous chamber carved into the rock of a mountain.
    Trala and Lind hold an endless horde of goblins at the arched gateway, while a huge machine of some sort looms over a bottomless pit.
    (par)
    Within the chamber are a crooked desk, etc. [TO DO]
    (par)
    (stranger appearance)

(stranger appearance)
    %% appearance when holding something
    *($obj is #heldby #Stranger)
    %% he holds some non-item things that we don't want listed
    (item $obj)
    The stranger is holding (a $obj), looking around uselessly.
    (stranger room inventory)

(stranger appearance)
    %% initial appearance - may need some more of these...
    The stranger looks around, bewildered.
    (stranger room inventory)

(stranger room inventory)
    %% what's in the stranger's pocket?
    (collect $Obj)
		*($Obj is #in #StrangerPocket)
		~(current player $Obj)
	(into $List)
    %% how many things?
    (length of $List into $InvCount)
    %% first item in pocket is only revealed in room desc when there's a second item
	(if) ($InvCount > 1) (then)
		    In his coat pocket (is $List) (a $List).
		(notice $List)
	(endif)
12 Likes

While @Draconis is keeping busy insulting the local whale shark population, @Pacian does a nifty little double-back, adding a dollop of code which will direct the player’s attention to where the important stuff for later is. Nice attention to detail early in development, ensuring that the initial premise is simmering and reducing nicely for the rest of the game-ingredients to be added to the pot.



Pacian’s tasting code sampler reminds me of Bilbo’s cheating in Gollem’s cave: “What do I have in my pocket?”



EDIT: And this reference to Tolkien feels appropriate when looking at the rest of the Pacian’s sample. Goblins, a cavernous chamber with a looming machine, a trio of heroes… That’s already a big chunk of setting and a great narrative kick-off in only a few bits of description.

>STRAIGHTEN DESK

8 Likes

Examining Pacian’s second code snippet -

Summary
#AncientSanctum
(room *)
(name *) Ancient Sanctum \(tied to the stranger\)
(look *)
    (select)
    So this is where the unlikely trio have been journeying towards all this time: a
    (or)
    A
    (stopping)
    cavernous chamber carved into the rock of a mountain.
    Trala and Lind hold an endless horde of goblins at the arched gateway, while a huge machine of some sort looms over a bottomless pit.
    (par)
    Within the chamber are a crooked desk, etc. [TO DO]
    (par)
    (stranger appearance)

(stranger appearance)
    %% appearance when holding something
    *($obj is #heldby #Stranger)
    %% he holds some non-item things that we don't want listed
    (item $obj)
    The stranger is holding (a $obj), looking around uselessly.
    (stranger room inventory)

(stranger appearance)
    %% initial appearance - may need some more of these...
    The stranger looks around, bewildered.
    (stranger room inventory)

(stranger room inventory)
    %% what's in the stranger's pocket?
    (collect $Obj)
		*($Obj is #in #StrangerPocket)
		~(current player $Obj)
	(into $List)
    %% how many things?
    (length of $List into $InvCount)
    %% first item in pocket is only revealed in room desc when there's a second item
	(if) ($InvCount > 1) (then)
		    In his coat pocket (is $List) (a $List).
		(notice $List)
	(endif)

I was on the verge of asking @Rovarsson what his full understanding of it was. Then I considered whether it might be a good time to make the first call to Dialog tech advisor @improvmonster for clarification.

However, by continuing to stare, and referring back to the original Dialog lesson, I think I grokked it, and so boringly I don’t think I need to question either of these two folks yet.

My understanding: The stranger picks things up. Every time they do, they put the presently held thing in their pocket. We can see what the stranger’s holding, and the room description will now also describe what’s in their pocket once they have more than one item in total. And by defining some things as not being ‘items’, Pacian spares those things being subject to all this behaviour by the stranger.

-Wade

9 Likes

10 Likes

i’d like to step in for a second and draw attention to two very dialog-y tools pacian is using.

the first:

(select)
    So this is where the unlikely trio have been journeying towards all this time: a
    (or)
    A
    (stopping)

the (select) statement sets up a looping construct and the (stopping) tells the compiler how to perform the loop. (stopping) means do each thing in sequence then repeat the last one. you can also use (at random), (cycling), (purely at random), as well as a couple others.

while the (select) is the easiest way to vary or spice up descriptions or NPC responses:

The princess 
     (select) 
     slaps you (or)
     kicks you (or)
     offers you a timeshare 
     (at random)

it’s a LOT more powerful than that, though, because you can shove whole blocks of code in between the (or) that can be executed however you’d like.

the second:

(collect $Obj)
		*($Obj is #in #StrangerPocket)
		~(current player $Obj)
	(into $List)

introduces the dialog LIST. this is sort of an array but more like a list in lisp, prolog, etc. it’s the main data structure in dialog and there are a LOT of built-in ways to work with them as he does in his next few statements.

Lists are another aspect of dialog that take some getting used to (think car | cdr in lisp) but once you do they’re very powerful. they’ll come up again in more obtuse ways and i’ll say more then.

15 Likes

Excellent. Thank you, tech advisor!

Right. I’m guessing the parlance for these cycling terms comes from the Inform 7 segment of Linus’s inspiration for Dialog, as they’re the same ones.

-Wade

9 Likes

I’m not familiar with LISP or Prolog—can you say more about how a list is different from an array?

3 Likes

----deep and respectful bow----

Oss

The Great and Enlightened Fukui-san (otherwise known as @improvmonster) has graced us with wisdom and insight from the Dialogic Cloud of Fragrant Steam. Thank you for your words.

5 Likes

a dialog list is a sequence of values (like an array) but the values are manipulated much differently.

a list has a $Head and a $Tail (this is denoted [ $Head | $Tail ]).

if the list is [a b c d], the $Head is ‘a’ and the $Tail is [b c d].

so if you’re manipulating a list, at it’s deepest level your’re usually doing so recursively, that is, doing something with the $Head and then passing the $Tail back to the same routine until you reach the end of the list.

if we have a list of objects to eat [#apple #mango #pear #banana] and we want to EAT each of them, we would do something like:

(eat []) 
      They're all gone. The list is empty and we're done.
(eat [ $Head | $Tail ]) 
      You eat (the $Head). (line)
     (eat $Tail)

having said this, dialog has a ton of built-in ‘convenience’ predicates for manipulating lists, so you don’t have to do everything recursively. .

10 Likes

Thank you!

Anyway, very intrigued by the updated code snipped from Pacian. Who is this mysterious stranger? Why does he have so many things in his pockets? What is their significance? And how does this whole goblin-fighting/ancient sanctum situation tie in with a one-verb game where the verb is “fly to”?

We’re seeing a lot of interesting and strongly flavored ingredients here, and I’m curious how they’re all going to come together!

8 Likes

I confess, having never coded in anything but Inform, that my eyes go zooey when looking at the code. @severedhand, your synopsis was greatly appreciated.

It was surprising that @Pacian let this special ingredient stand when it’s common knowledge that @Draconis is a professional linguist who is one of those enviable people who is hopelessly in love with their job, as has already been demonstrated in this thread.

But then I started playing Weird City Interloper and I don’t think the home-court advantage of nonhuman language is as big as I thought it might be for Daniel. Pacian clearly has some muscles to flex in this arena. World-building using language is clearly a comfortable space for the challenger, who can do a lot with a little. Writing beautifully without being verbose is one of the challenger’s strengths. And I’m a huge fan of limited parser games. When they’re done right they keep all of the charm and open feeling of a traditional parser, while eliminating the frustrations. I wrote a limited parser game myself, and it’s much, much harder than I thought it would be. So I have tremendous respect for anyone who can create an elegant and user-friendly design for a game with a limited command set. Add in that arachnoid spy and I see things gelling very nicely for Pacian.

This is a really interesting pairing, though, because the Iron Chef has done limited parsers with brief but evocative writing as well, and done them very well. See Familiar Problems, which was very fun and which was written in a short period of time. Less than a week, I think? So Daniel has already proven that they can absolutely nail a good game in the time period we have here. In my experience Daniel tends more towards humor while Pacian’s games are more serious, but they are well-matched in their ability here.

Folks, if you haven’t played WCI, I’m recommending it. I don’t know how I didn’t play it for so long.

14 Likes

I was definitely surprised going into this that I was given a challenge ingredient involving language! But my esteemed opponent is no novice, and he wouldn’t have chosen this one if he didn’t think it could lead him to victory.

I’m also taking a dangerous gamble with the translation puzzle. It means the entire game rests on what’s fundamentally a single puzzle—and without testers, I have only my own estimation of how difficult and how satisfying that puzzle will be. I’m a better designer and programmer than I am a fiction writer, and if the puzzles fall flat, it will all come down to my writing and worldbuilding—an arena where the esteemed challenger’s skills are famous.

How will this end? I have no idea!

But it means I’m going to have to break out some advanced coding skills if I want to triumph. It’s time for access predicates!

@($Obj reads $Inscription)
	($Obj has text $Inscription)
	(word assigner $Obj $Inscription)

@(word assigner $ [])
@(word assigner $Obj [$Head|$Rest])
	($Obj bears $Head)
	(alien word $Head)
	(word assigner $Obj $Rest)

Access predicates, Dialog’s version of macros, are more limited than in something like LISP or even ZIL. But sometimes they let expensive computations be delegated to compile-time, like here.

I’m also keeping the vocabulary learned so far in a plist, the LISP-y version of a dictionary. This isn’t a feature built into Dialog, but a simple, elegant library for it was written by Ben Kirwin, and I’ve used it in Wise-Woman’s Dog (to keep track of how many goats are given to each person) and Stage Fright (to keep track of how many more turns each object remains staked).

(global variable (assigned vocabulary []))

(update translation of alien $Word to $List)
	(assigned vocabulary $Vocab)
	(plist $Vocab with $Word updated to $List is $NewVocab)
	(now) (assigned vocabulary $NewVocab)

(perform [unassign $Word])
	(assigned vocabulary $Vocab)
	(plist $Vocab without $Word is $NewVocab)
	(now) (assigned vocabulary $NewVocab)
	You remove your tentative translation for the word “(no space)$Word(no space)”.

This library consists of only a few lines of code, with all the comments stripped out:

(plist [$query $result | $] key $query has value $result)
(plist [$ $ | $rest] key $query has value $result)
    (plist $rest key $query has value $result)

(plist [$query $ | $rest] without $query is $result)
    (plist $rest without $query is $result)
(plist [$k $v | $rest] without $query is [$k $v | $result])
    (plist $rest without $query is $result)
(plist [] without $ is [])

(plist $plist with $k updated to $v is $result)
    (plist $plist without $k is $removed)
    ($result = [$k $v | $removed])

But it’s a surprisingly powerful and versatile tool, playing to Dialog’s list-manipulations strengths!

10 Likes