aboutsummaryrefslogtreecommitdiff

View this file with results and syntax highlighting here.

Constant

It's one of the simple ones: f˙𝕩 is f. And 𝕨f˙𝕩? It's f. Like the identity functions, Constant doesn't compute anything but just returns one of its inputs. It's somewhat different in that it's a deferred modifier, so you have to first apply Constant to its operand and then to some arguments for that non-event to happen.

The design of BQN makes Constant unnecessary in most cases, because when a non-operation (number, character, array, namespace) is applied it already returns itself: Ο€Λ™ is the same function as Ο€. If you've used much tacit programming, you've probably written a few trains like 2Γ—+ (twice the sum), which is nicer than the equivalent 2Λ™Γ—+. However, a train has to end with a function, so you can't just put a number at the end. Applying Λ™ is a convenient way to change the number from a subject to a function role.

    +Γ·2   # A number

    +Γ·2Λ™  # A function

    3 (+Γ·2Λ™) 7

When programming with first-class functions, the constant application shortcut becomes a hazard! Consider the program {π•¨βŒΎ(2βŠΈβŠ‘) 𝕩} to insert 𝕨 into an array 𝕩 as an element. It works fine with a number, but with a function it's broken:

    ∞ {π•¨βŒΎ(2βŠΈβŠ‘) 𝕩} 1β€Ώ2β€Ώ3β€Ώ4

    M ← -
    m {π•¨βŒΎ(2βŠΈβŠ‘) 𝕩} 1β€Ώ2β€Ώ3β€Ώ4

Here m is applied to 2βŠ‘π•© even though we want to discard that value. Spelled as m, our context-free grammar knows it's a function argument, but this doesn't affect later usage. Under always applies 𝔽 as a function. The proper definition of the insertion function should use a Λ™, like this:

    m {π•¨Λ™βŒΎ(2βŠΈβŠ‘) 𝕩} 1β€Ώ2β€Ώ3β€Ώ4