So your problem is that there are character strings that aren’t
valid programs? Maybe + [1] is your language of choice.

[1] https://esolangs.org/wiki/%2B


Am 28.09.21 um 10:52 schrieb 'Pascal Jasmin' via Programming:
longer arbitrary chains of ACCAACVC trains are not possible within a coherent 
mental model because some combinations are undefined, and others reuse 
arguments in separate modifiers such that no coherent usefulness can be implied.






On Monday, September 27, 2021, 10:17:16 p.m. EDT, Henry Rich 
<[email protected]> wrote:





Scanning your message, I don't see any examples of things that can't be
done with Ken's language.  I conclude that you don't have any such examples.

Henry Rich

On 9/27/2021 10:06 PM, 'Pascal Jasmin' via Programming wrote:
A better question is whether beta-r harms the language and how, which is why I 
started the reply with how it is harmful.  beta-r locks us into some dumb 
choices, and the confusion resulting from inconsistencies, or just memory tax, 
will be a nightmare.  Especially with 4+ long trains.

consistent AC CA CC CvnC modifier trains are extremely useful.  It extends 
modifier trains to include conjunctions.  These are the only new necessary 
trains, which would shorten the lookup/parsing tables. It allows for valid 
interpretations of:

(+@@-/\) an adverb train with only one valid parentheses/interpretations.  It 
cannot be written as fast without the language improvement.

A few of us have found ways around the absence of conjunctions in modifiers.  Its 
possible without language changes. beta-r would "force" support for some 
terrible train choices, or abandon something that was working well enough.





On Monday, September 27, 2021, 08:45:08 p.m. EDT, Henry Rich 
<[email protected]> wrote:





All I would be interested in reading is a SHORT example of something that
can't be done without changing the language. We are NOT trying to find the
best design.

Henry Rich

On Mon, Sep 27, 2021, 8:26 PM 'Pascal Jasmin' via Programming <
[email protected]> wrote:

Lets start with the 2 worst, irredeemable most useless, trains

C0 V1 C2 -> (u C0 v) V1 (u C2 v) fork result.  duplicating input to both
edge conjunctions.  Will never be used.

Alternative of (C0 V1) C2 turns this into A C train which has useful
interpretation.  Avoids parentheses in one of the 2 natural (validating)
parenthesizings of this string.

C1 A2 -> u C1 (u A2) .  A far less dumb alternative would be u C1 (v A2).
At least both AC and CA would be conjunctions.

I prefer (u C1 v) A2 out of consistency and coherence.  While u C1 (v A2)
may have a use, its 50/50 which would be used/wanted more.


The next category is that of slightly longer combinations of A and C
(the words coherent and consistent refer to qualities that let you
understand a concept/execution train instead of memorizing incoherent and
inconsistent result tables.  A highly valuable, if not priceless, aspect of
a language.)

AAC not defined. bad syntax error. (AA)C is fine interpretation and
already defined sanely. AA -> (AA) is everywhere else in J.
ACA -> (u A) C (v A).  Not useless, but not obviously more frequently
wanted than coherent ((u A) C v) A2
CAA -> coherent
CAC -> doesn't exist.  syntax error.  Can be ((u C v) A) C2.  An adverb
(or CA) result.
ACC -> (u A) C1 (u C2 v) reuses u, making it useless.  A perfectly
coherent result would be one equivalent to both (AC)C and A(CC).
Associativity is prizeable.
CCA -> (u C1 v) C (u A).  same uselessness.  (CC)A or C(CA) preferably
identical interpretations is obviously better.
CC not defined.  Most important of all.  -> ((u C1 v) C2) is an adverb.
The consistency with AC is that arguments are inserted with their natural
parenthesized order, and then consistent with V0 V1 C2 -> (V1 C2 V0) which
allows using conjunctions in strand/double adverb mode, which avoids the
frequent error of wishing the v argument to a conjunction referred to the
full verb phrase on the right.

First, it is more useful that definitions exist than not.
Two, definitions that reuse arguments for different modifiers have no
applicable use expectation.

Its one thing to defend the interpretations that are not useless, over a
more consistent approach.  I could listen to such a defense.  It's an other
to defend useless interpretations.

The next/last category are the ones that result in trains.  Rather than
itemize each train, let me just go over one cool example that I can think
of.

(] #~ ")
     1 (= 2&|)(] #~ ")_1 i.5

1 3

its cool, except that for the " conjunction, the correct right argument is
always _1 .  But there is a cooler adverb form:

(("_1) # ])

Noting that it's cool, might lose track that the purpose of the coolness
is that it can be assigned as an adverb.  The power of J is in its higher
order functions that can be assigned.  The alternative definition is:

select =: 1 : 'u"_1 # ]'

it is already very easy to make train results from adverbs.  And an
enhancement:

ns =: 2 : 'u"_1 v ]'

allows substitutes for # as v.  Including i. or perhaps a compound verb
that dug through a boxed structure inside items.  A super cool conjunction
that was extremely easy to write (the important value provided), and even
cooler than the train version.  Cooler means harder to name.

The problem with inconsistent "non binding" of some arguments in modifier
trains is that I can write the following

(] #~ " _1)  NB. parses just fine.

The intent is that if the rule of leftmost 3 parameters in a modifier
train get grouped together, and intent suggested by _1 indent, then perhaps
this means

(] (#~) ")_1  NB. making an adverb out of original conjunction through
binding

when it actually means:

1 (= 2&|)(] (#~ " _1)) i.5

0 0 0 0

1 0 0 0

0 0 0 0

1 1 1 0

0 0 0 0

It is a minority of J users that understand trains.  Adding conjunctions
and adverbs into permissible train formation items just adds an exponential
rate of errors, and removes accessiblity even further for most J users.
Sometimes the modifiers are binding, sometimes they generate a modifier
that results in a train... increases reading taxation, that requires good
memory of large inconsistent result tables, and whether a pattern fits into
one of the entries, and loses the mental simplicity of following a train's
dyadic/ambivalent terms to understand it.


     If we change the old definitions that just means
we have even more work to do.

This can be done from the parsing table approach which may be manageable

SHORT examples
+/ -  @: -> +/ (-@:) -> -@:(+/)  NB. gains strand notation for
conjunctions.  Things consistently bind when you expect them to.

+ - * (@ @) -> + - (* @) @ -> + (*@-)@ -> *@-@+ NB. natural strand binding
order.  Intuitively extendible to longer modifier train "saved name"

If the A V -> V A proposal is accepted then,

@ (+/) - -> -@(+/) NB. double left arguments also parse.  This adds
flexibility to  C C train for binding order:

* (@ @)- + -> * (@-)(@+) -> *@-@+  NB. same end result but with more
partial binding options.  Can be good simplicity argument for + - left
binding order for same result.

Consistency with AC and CA means that binding any argument within the
conjunction train is easy

(@@+) -> (@(@+)), (@-@) -> ((@-)@), (*@@) -> (*@)@ are all partial
bindings that allow same end result with further conjunction or strand
parameters... when AC and CA are consistent.


part of the consistency importance is what happens when modifiers return
modifiers.  Keep consuming right arguments is the "correct" behaviour.  New
surprise incoherent trains are not welcome.



On Monday, September 27, 2021, 01:15:18 p.m. EDT, Henry Rich <
[email protected]> wrote:





The primary goal of reintroducing the old trains was to make the old
documents valid.  Whether there is a better way to define the old trains
is not to the point.  If we change the old definitions that just means
we have even more work to do.

You are not improving your credibility by asserting that 'all of the
train results... are at best marginally useful'.  I used them quite a
bit and was sad to see them go.  Indeed, I never had a case where I
wanted to write a modifier and found the trains wanting.  I admit that I
was content with the structure of J as it is, not trying to create a
different approach to function definition.

You would have to actually demonstrate examples where an alternative
definition would enable some important new application.  Then we could
judge whether the change is worth the large effort required.  I would
add, we would need to do this before the beta period expires.

I have just now gone through some of your list of proposed changes and I
have yet to find one I agree with, but that's just my opinion.  The
burden is on you to demonstrate the superiority of your proposal.  Just
one SHORT example would be a good start, something important that the
old trains are lacking.  With luck we might find that you are redefining
something so obscure that no one has ever used it, for which a change
would be easier.

In the meantime, adding parentheses to your bidents is harmless and
solves your problem.

It is gratifying to see the interest that this old code has ignited.

Henry Rich

On 9/27/2021 12:46 PM, 'Pascal Jasmin' via Programming wrote:
       Since you can
easily make your old code work by putting parentheses in +@/ to make
(+@)/ and that preserves old documents, that would be the best solution.

That J sometimes "does what I mean" is a mixed blessing.  Great when it
works, but relying on it means syntax errors due to its incompleteness in
applying the intuitive concepts that could make writing modifiers easier.
It all boils down to "could Ken have made a mistake"

Modifier trains are an awesome idea, and it is great to have enhanced
interpretations of code.
Removing these interpretations for J6 were viewed as a better idea than
these interpretations.
The appeal of modifiers trains that return trains can seem less scary
than modifiers that return modifiers.  The latter though is part of the
language since at least J6.  Some of the "old trains" do the sane modifier
autobinding, while others return trains.
All of the train results, if not completely useless, are at best
marginally useful.  A good test would be for someone to come up with a
single useful function in that form.  Even if such a function exists, it
can be easily/clearly written as a custom modifier in less time than it
takes to research whether one of the train producing modifier trains
provides a useful equivalent shortcut.
CC CA AC CnvC provide tremendous benefit in having valid
interpretations.  Who wouldn't prefer more valid parsings and less syntax
errors.  But the benefit only exists when interpretations are coherent,
useful, and consistent.  That benefit only occurs if all of the modifier
trains produce the natural modifier bindings that a fully bound in place
expression would produce.

That it might be scary to consider CC an adverb that produces a
conjunction (u C1)C2 -> AC -> (uA)(Cv) or a conjunction that provides an
adverb ((u C1 v)C2) doesn't force you to use the scariness.  It is
consistent with the  C C V train, and almost the V C C train.  (the
execution of v1 C v2 C V is (v1 C v2) C V, while V C C produces V C (v2 C
v3)).  While V C C can have useful applications, the "special" bracketing
can be accomplished if CA had a sane interpretation (u C v)A.  Then V C1 C2
to have current interpretation can be written as C2 (V C1).
To Ken's credit, the dumb C A train can be avoided with C A 1 : 'u'.  ie
C A A is sane.
C V C (and all duplicate u/v modifier trains) however are just mistakes
and useless.
Reintroducing these trains has great potential.  But we need to fix the
bad ones before code gets written using them, and irreparably breaks J's
potential.
It can also break complex embedded existing code.  Techniques for
strand/double adverb notation might rely on interpreter quirk, though are
no longer needed with my proposal.
+ 1 : '@u/'

(@+)/

On Monday, September 27, 2021, 09:58:26 a.m. EDT, Henry Rich <
[email protected]> wrote:




The original parsing rules proved very useful.  As you point out,
reinstating them does change the meaning of some trains.  Since you can
easily make your old code work by putting parentheses in +@/ to make
(+@)/ and that preserves old documents, that would be the best solution.

If it would help you find what needs changing, I could type out a
message when a modifier trident is parsed.

Henry Rich

On 9/27/2021 9:28 AM, 'Pascal Jasmin' via Programming wrote:
beta-r breaks the partial sane autoparenthesizing that existed for
short expressions
in 9.02

         +@/

(+@)/

@+/

(@+)/


it "breaks" when it gets too long

@+@-
|syntax error

But usually/always the intent when you write the above is (@+)(@-).
The syntax error is at least helpful that the parser is just incomplete in
being able to handle longer versions of its short parsing talent.
with beta-r, your breaking valid sane code no one ever called a bug,
and replacing helpful syntax error with "mostly garbage" functional
interpretation
Mostly garbage could be considered complete garbage.  The case for
"mostly" is that some of the trains do the sane thing they should
*(+@-@)
+@-@*  NB. exactly sane result of autoparens.

       *(@-@+)

*@+ - *@+ NB. complete useless garbage when you might have intended a
sane use but got the train rules mixed up, and in this case the parsing
greediness determines the sanity/insanity.  (long trains group the leftmost
3 terms)
+@-@ is adverb (+@-)@ = sane

@-@+ is (C V) ((@-@)+) where the conjunction part is a fork that is
useless because of duplicate arguments to the (C0 V1 C2) train.

beta-r is harmful because:

1. it breaks existing valid code.
2. produces worse expressions than a syntax error.
3. prevents the natural and useful enhancement of J's parsing by
interpreting garbage of no practical use.
4. Modifier trains are an extremely useful addition to J, but only if
they have useful interpretations.
(C V C) conj -> (u C V C v) ie. interpreted the same way as if terms
had been written inline is intuitive and powerful partial function
enhancement
.

On Monday, September 27, 2021, 02:29:30 a.m. EDT, Raul Miller <
[email protected]> wrote:




Parenthesization is basically talking about how the parser itself
functions. Every point where the parser combines tokens is a point
where you could place a parenthesis pair in the original text without
significantly altering the parsed meaning of that text.

So proposals involving changing the parenthesis rules are proposals to
replace the parser itself.

But changing the parser would invalidate quite a bit of existing
documentation on J, which would place a severe burden on the J
community.

Take care,


--
Raul

On Mon, Sep 27, 2021 at 12:42 AM 'Pascal Jasmin' via Programming
<[email protected]> wrote:
When you envision 'even longer modifier trains', you are implicitly
requiring a stack of more than 4 words.

which can be avoided by (auto)parenthesizing outer modifier train,
such that there's always at most 4 tokens.

Do I understand the following expression to mean that modifier trains
group left to right (somehow)?
         @ @ + - @

(@ @ +) - @


         @ @ + - @ /

((@ @ +) - @)/



/ @ @ + - @

|syntax error

| /@@ +-@


/ (@ @ + - @)

/((@ @ +) - @)


@ + @ - @

(@ + @) - @

shouldn't it group from the right?


On Sunday, September 26, 2021, 10:46:13 p.m. EDT, Henry Rich <
[email protected]> wrote:




Since the goal was to make the old documents still usable, changes
would
require strong arguments demonstrating their superiority.  You are
pitting yourself against Ken Iverson: may the better man win.

I can assure you that whatever is in your 'templating system' had zero
influence on the design and implementation of {{ }} .

When you envision 'even longer modifier trains', you are implicitly
requiring a stack of more than 4 words.

Henry Rich

On 9/26/2021 10:34 PM, 'Pascal Jasmin' via Programming wrote:
I've been working on an autoparenthesizing of modifier trains, with
interpretations that would seem much more useful than the "old stuff".  I
don't have a good interpretation for A V train, so I guess it could stay as
suggested.  The following are what I'd prefer, added after -> ( = means
equivalent)

V0 V1 C2    conj    V0 V1 (u C2 v)  -> V0 (V1 C2) = V1 C2 V0
A0 V1 V2    adv    (u A0) V1 V2
C0 V1 V2    conj    (u C0 v) V1 V2 -> (C0 V1) V2 = A V2
C0 V1 C2    conj    (u C0 v) V1 (u C2 v) -> u (C0 V1) (C2 v)
A0 A1 V2    conj    (u A0) (v A1) V2 -> (u A1 A2) V2
N0 C1 A2    adv    N0 C1 (u A2) -> u (N0 C1) A2
N0 C1 C2    conj    N0 C1 (u C2 v) -> u (N0 C1) (C2 v) = ((N0 C1 u)
C2 v) = (v (u (N0 C1)) C2)  parentheses not needed.
V0 C1 A2    adv    V0 C1 (u A2)  -> u (V0 C1) A2
V0 C1 C2    conj    V0 C1 (u C2 v) -> same as N C C
A0 C1 N2    adv    (u A0) C1 N2
A0 C1 V2    adv    (u A0) C1 V2
A0 C1 A2    conj    (u A0) C1 (v A2)  -> u A0 (C1 v) A2
A0 C1 C2    conj    (u A0) C1 (u C2 v) -> ((u  (A0) (C1 v)) C2) =
adverb
C0 C1 N2    conj    (u C0 v) C1 N2 ->  v (u C0)(C1 N2) =  (u C0 v)(C1
N2)
C0 C1 V2    conj    (u C0 v) C1 V2  -> same as above
C0 C1 A2    conj    (u C0 v) C1 (v A2) -> ((u C0 v) C1) A2 = adverb
C0 C1 C2    conj    (u C0 v) C1 (u C2 v) -> ((u C0 v) C1) C2 =
conjunction A C
A0 C1    adv    (u A0) C1 u (adverbial hook)  -> (u A0) C1 v

The beauty of the suggested forms is that there is not much to
remember, and allows for parenthesless forms.
V0 V1 C2 -> V0 (V1 C2) is just the only valid parenthesization of the
left expression.
C0 vn C2... More modifiers -> (C0 vn) C2...M ie. when a nv term is
between 2 conjunctions it binds to the left one.
Whenever C vn appears, (C vn) is bound is the only special rule.  It
binds ahead of other modifiers to right.
To permit even longer modifier trains, while keeping the 4 token
stack:
C0 C1 M2 M3 -> C0 C1 (M2 M3)

Reusing parameters in multiple modifiers seems stranger than the
still strange inserting them seemingly arbitrarily within a modifier train.
If these are useful, they are best made into a purpose modifier rather than
as default parsing rules that will confuse.
A cool enhancement would be multiple right bindings to modifier
trains that contain multiple conjunctions:
(C0 C1 M) v -> (C0 v) C1 M ie. A conjunction modifier train binds v
to the leftmost (unbound) conjunction.
((C0 v) C1 M) v2 -> (C0 v) (C1 v2) M = (C0 C1 M) v v2
u ((C0 v) C1 M) -> ((u C0 v) C1) M ie binding from left or right
provides options similar to "old stuff"
templating system that may have formed basis for {{ }}, and allows
for rich custome modifier trains:
http://www.jsoftware.com/pipermail/programming/2020-September/056558.html

On Sunday, September 26, 2021, 12:01:45 p.m. EDT, Henry Rich <
[email protected]> wrote:




Nostalgic old-timers will be happy to see the return of Modifier
Trains,
such as (@/), which were in early J but were deleted long ago.  See
https://code.jsoftware.com/wiki/Vocabulary/fork#invisiblemodifiers .

These trains were one of Ken Iverson's elegant brilliancies.  Few used
them, and they are not needed, because anything they do can also be
done
with explicit modifiers ({{ u @ v/ }} is equivalent to (@/)).  No one
need rush out and look at them.

We have brought them back because to do so was easier than updating
all
the old J literature that refers to the forms.  And because they're
cool.
Henry Rich

--
This email has been checked for viruses by AVG.
https://www.avg.com

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm


--
This email has been checked for viruses by AVG.
https://www.avg.com

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm



--
----------------------
mail written using NEO
neo-layout.org

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to