Dan writes:
"
One frustration I encountered which significantly complicated the solution
was that this:

        adverbWhichProducesAnAdverb =: 1 : '/'
        anotherAdverb =: ~

        totalAdverb =: adverbWhichProducesAnAdverb anotherAdverb

        + totalAdverb
     |syntax error: totalAdverb
     | +totalAdverb

is a syntax error in J. I haven’t thought through why that is, or should
be, the case (grammatically speaking), but this is not the first time it’s
tripped me up [2].

In the case of the pare.ijs script, it precluded any meaningful amount of
code reuse.  If someone has a grammatical explanation for this error, I’d
love to be walked through it.
"

This is my take:

The sentence ( x a0 a1 ) is equivalent to ( (x a0) a1 ); so, when (x a0)
produces an adverb, ( (x a0) a1 ) produces a train of two adverbs.  In
contrast, ( x (a0 a1) ) tries to pass the adverb (x a0) as an argument to
the adverb (a1) but this is not permitted and the current official J
complains accordingly; older J interpreters allowed it but this bug (or
facility, depending on your perspective) was removed and I can only blame
myself for that :j [0].  This facility is restored in a Jx permissive
interpreter [1], and it might help to clarify the issue:

   JVERSION  NB. J...
Installer: j602a_win.exe
Engine: j803/2014-10-19-11:11:11
Library: 6.02.023

    (<'/')  `:6  <adv
/(("_)(((`'')(&(<@:(,^:(0:``:)&6@:(<@:((0;1;0)&({::))))@:[)))((`_)(`:6))))
   ((<'/')  `:6) <adv
/(("_)(((`'')(&(<@:(,^:(0:``:)&6@:(<@:((0;1;0)&({::))))@:[)))((`_)(`:6))))

    (<'/') (`:6  <adv)
|syntax error
|       (<'/')(`:6<adv)
|[-5]

In comparison,

   JVERSION  NB. Jx...
Installer: j602a_win.exe
Engine: j701/2014-10-14/10:02/x/wd
Library: 6.02.023

    (<'/') (`:6 <adv)  NB. Boxing the / adverb boxed
┌─┐
│/│
└─┘

    (<'"') (`:6 <adv)  NB. Boxing the " conjunction
┌─┐
│"│
└─┘

I hope it helps.

[0] [Jprogramming] J Myths Puzzles
    http://www.jsoftware.com/pipermail/programming/2008-February/009871.html

[1] [Jprogramming] J Extensions
    http://www.jsoftware.com/pipermail/programming/2014-March/035925.html




On Tue, Dec 15, 2015 at 6:23 PM, Dan Bron <[email protected]> wrote:

> Raul wrote:
> > Yeah... personally, I consider explicit code to be a subset of tacit
> code.
>
> I think of explicit and tacit as two distinct but related languages. That
> “:” is tacit doesn’t mean the programs written in it are tacit: I could
> (theoretically) write a tacit Lisp interpreter, but that doesn’t mean the
> Lisp programs I pass to it are written in J.
>
> > Still, even if you do not like the appearance of the code I offered,
> > perhaps you could at least tell me if there is something wrong with
> > what it does?
>
> This question somewhat misses the point.
>
> Say this were English class and I asked you to compose a haiku on the
> topic of winter. Say then that you came back with a sublime, stirring
> sonnet on winter that captured the bitter winds; the trees sparking with
> ice crystals as if they were fruiting diamonds; the lamps glowing in
> twilight windows; the yearning for spring.  In short, you delivered to me a
> beautiful poem which precisely evoked the subject. A work of art whose like
> hasn’t been seen before in the world.
>
> Except the assignment was a haiku, and you gave me a sonnet.
>
> In other words, the “how” is not a means here, but an end. The requirement
> for tacit is precisely that: a requirement. It is a fundamental part of the
> specification, not a suggestion on coding style.  Note that, absent this
> requirement, Am would *not be required at all*, as we could simply write
> the target modifiers explicitly and dispense with the intermediate
> metaprogramming step.
>
> If it helps, your audience is J programmers, not end users. The result to
> keep your eye on is the *actual notation*, not the output of the program.
> The object is not to transform inputs to outputs, but to assist J
> programmers in writing purely (purely!) tacit code. Just as there are
> guides on how to compose haikus, here we are writing a guide on how to
> write J, tacitly.
>
> If you want to talk about *why* that’s a goal, I’d be happy to have that
> conversation (but not today; I’m not feeling very eloquent).
>
> So: yes, absolutely, your code produces the correct output for a given set
> of inputs. But while that’s necessary, it’s not sufficient.
>
> It may help clarify my aims if I provide an example of what I’m looking
> for. So I went ahead and implemented the idea I referenced earlier:
>
> > Exercise for the very ambitious reader:  define a tacit adverb opTheat
> > (operating theatre), which, given a verb (the surgeon), derives another
> > tacit adverb, such that
> >
> >           surgeon opTheat
> >       ((<":0)`) (surgeon`) (@.(0; 1 2))
> >
> > The objective is to be able to provide an convenient utility / interface
> for
> > adverbial programmers, so that their responsibility is only to write the
> > core a.r.-transforming function (i.e. perform the surgery), and not
> always
> > have to prepare the patient and the operating theatre themselves.
>
>
> You can see the implementation at [1], but the short story is you can now
> create perfectly tacit adverbs simply by creating a (tacit) verb which
> expects an atomic representation as input, and produces another atomic
> representation as output.
>
> This permits us to produce arbitrary J structures, of any part of speech,
> tacitly.  Here’s the example we’ve been working with from Pepe:
>
>         NB. Given the fork (v0 v1 v2), bends the outer tines
>         NB. such that it produces (v0@[ v1 v2@])
>         NB. For rationale, see the thread:
>         NB.
> http://www.jsoftware.com/pipermail/programming/2015-December/043657.html
>         xform =. (left center right)`'' ('[' atop~ ])`(']' atop~
> ])`]@.((;:'left right') i. [)"0 L:1 ]
>           atop =. '@' <@; <@:,&boxopen
>
> Notice this is simply a tacit verb which both operates on and produces the
> atomic representation of a simple 3-verb train. Now, we only need to pass
> this verb to our magical new adverb, and:
>
>         (+: + -:) xform Pare
>      +:@[ + -:@]
>
> Thus:
>
>          3 4 (+: + -:) xform Pare 2 4
>      7 10
>
> Or, as a simpler example, the identity adverb:
>
>         +  ]Pare
>      +
>         +/ ]Pare
>      +/
>         3  ]Pare
>      3
>         a: ]Pare
>      ++
>      ||
>      ++
>
> Note that this actually executed the resulting a.r. to produce a (derived)
> entity. Returning to the original goal of Am, which was simply to produce
> the a.r. directly and defer execution to the caller, then:
>
>         Ar =: ] Par    NB. Note “Par”, not “Pare” (no “e, no Execution)
>
>         +/ Ar
>      +-------+
>      |+-+---+|
>      ||/|+-+||
>      || ||+|||
>      || |+-+||
>      |+-+---+|
>      +-------+
>
>         (+/ % #) Ar
>      +-----------------+
>      |+-+-------------+|
>      ||3|+-------+-+-+||
>      || ||+-+---+|%|#|||
>      || |||/|+-+|| | |||
>      || ||| ||+||| | |||
>      || ||| |+-+|| | |||
>      || ||+-+---+| | |||
>      || |+-------+-+-+||
>      |+-+-------------+|
>      +-----------------+
>
> Now, the implementation is rough and I’m sure there’s room for
> improvement, but note to Pepe: no wickedness was employed :)
>
> One frustration I encountered which significantly complicated the solution
> was that this:
>
>         adverbWhichProducesAnAdverb =: 1 : '/'
>         anotherAdverb =: ~
>
>         totalAdverb =: adverbWhichProducesAnAdverb anotherAdverb
>
>         + totalAdverb
>      |syntax error: totalAdverb
>      | +totalAdverb
>
> is a syntax error in J. I haven’t thought through why that is, or should
> be, the case (grammatically speaking), but this is not the first time it’s
> tripped me up [2].
>
> In the case of the pare.ijs script, it precluded any meaningful amount of
> code reuse.  If someone has a grammatical explanation for this error, I’d
> love to be walked through it.
>
> -Dan
>
> [1] Pare script: Process Atomic Representations and Execute:
>     http://www.jsoftware.com/svn/DanBron/trunk/environment/pare.ijs <
> http://www.jsoftware.com/svn/DanBron/trunk/environment/pare.ijs>
>
> [2] Verb pipeline utility foundering on the inability to create adverb
> trains via derived adverbs:
>     http://www.jsoftware.com/pipermail/programming/2010-June/019755.html <
> http://www.jsoftware.com/pipermail/programming/2010-June/019755.html>
>
>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to