I tried to run your script but I was not able to go very far:
JVERSION
Engine: j805/j64/windows
Beta-12: commercial/2016-09-30T15:50:47
Library: 8.05.09
Qt IDE: 1.5.2/5.6.1
Platform: Win 64
Installer: J805 install
InstallPath: g:/program files/j
Contact: www.jsoftware.com
isNoun =: (0 = 4!:0 ::0:)@:<
isgerund =: 0:`(0 -. at e. 3 : ('y (5!:0)';'1')"0)@.(0 < L.) :: 0:
isgerundA =: 1 : ' if. isNoun ''u'' do. isgerund m else. 0 end.'
eval =: 1 : ' a: 1 : m'
ar =: 1 : '5!:1 <''u'''
aar =: 1 : 'if. isNoun ''u'' do. q =. m eval else. q =. u end. 5!:1 <
''q'' '
tie =: 2 : 'if. u isgerundA do. if. v isgerundA do. m ar , v ar else. m
, v ar end. else. if. v isgerundA do. u ar , n else. u ar , v ar end. end.
'
tieA =: 2 : 'if. u isgerundA do. if. v isgerundA do. m ar , v ar else.
m , v aar end. else. if. v isgerundA do. u aar , n else. u aar , v aar
end. end. '
+ tie '/'
┌─┬─────┐
│+│┌─┬─┐│
│ ││0│/││
│ │└─┴─┘│
└─┴─────┘
+ tieA '/\'
┌─┬─────────┐
│+│┌─┬─────┐│
│ ││4│┌─┬─┐││
│ ││ ││/│\│││
│ ││ │└─┴─┘││
│ │└─┴─────┘│
└─┴─────────┘
lr_z_ =: 3 : '5!:5 < ''y'''daF =: 1 : 'a =. (''2 : '', (quote m) , ''
u'') label_. 1 : (''u 1 :'' , quote a)'
|value error
| a=.('2 : ',(quote m),' u')
Incidentally, the beta error report seems to be incomplete compare to
previous versions.
Anyway, what would be the product of (+:`-:AltM)("1) 3 3 3$1 2 3 4 ?
On Wed, Dec 14, 2016 at 3:03 PM, 'Pascal Jasmin' via Programming <
[email protected]> wrote:
> I previously attempted to encode strand notation into a linear
> representation (sometimes with bonus encoding info). I now present tools
> to directly encode into ar form.
>
>
> isNoun =: (0 = 4!:0 ::0:)@:<
> isgerund =: 0:`(0 -.@e. 3 : ('y (5!:0)';'1')"0)@.(0 < L.) :: 0:
> isgerundA =: 1 : ' if. isNoun ''u'' do. isgerund m else. 0 end.'
> eval =: 1 : ' a: 1 : m'
> ar =: 1 : '5!:1 <''u'''
> aar =: 1 : 'if. isNoun ''u'' do. q =. m eval else. q =. u end. 5!:1 <
> ''q'' '
>
> tie =: 2 : 'if. u isgerundA do. if. v isgerundA do. m ar , v ar else. m ,
> v ar end. else. if. v isgerundA do. u ar , n else. u ar , v ar end. end. '
> tieA =: 2 : 'if. u isgerundA do. if. v isgerundA do. m ar , v ar else. m
> , v aar end. else. if. v isgerundA do. u aar , n else. u aar , v aar end.
> end. '
>
> tie and tieA above differ in how they treat nouns. tieA will treat strings
> as if they are modifiers or verb names in the resulting gerund. tie can
> handle numbers, and the gerund form of strings is a noun. ` has the
> deficiency of not producing gerunds with non-verb arguments.
>
>
> + tie '/'
> +-+-----+
> |+|+-+-+|
> | ||0|/||
> | |+-+-+|
> +-+-----+
>
>
> + tieA '/\'
> +-+---------+
> |+|+-+-----+|
> | ||4|+-+-+||
> | || ||/|\|||
> | || |+-+-+||
> | |+-+-----+|
> +-+---------+
>
> strand notation is used in my multiadverb "framework". The advantage over
> gerunds is that entire verb phrases can be parsed without parentheses. 2
> parsers are provided:
> bG (buildGerund) is a conjunction where n indicates how many
> strands/phrases are needed.
> bG9 is an adverb that captures all phrases until the verb-token 9: is
> reached.
>
> They both require the same number of total tokens, but bG9 is more
> convenient if you wish to partially bind terms out of order and of course
> if there are a variable number of arguments. bG is more convenient if
> parameters are to be provided in fixed order, and to save a token for the
> user of your adverb.
>
>
> lr_z_ =: 3 : '5!:5 < ''y'''daF =: 1 : 'a =. (''2 : '', (quote m) , '' u'')
> label_. 1 : (''u 1 :'' , quote a)'
> daFx =: (0 : ) 1 : ('a =. (''2 : ('', (lr m) , '') u'') label_. 1 : (''u
> 1 :'' , quote a)') NB. explicit. call with 0 left argbG =: 2 : 0 NB.
> builds gerund. recurses until n = 0
> select. n case. 0 ;1;_1 do. u case. 2 do. tieA u case. _2 do. (u tieA)
> case. (;/ _2 - i.20) do. (u tieA)(bG (n+1)) case. do. ( tieA u)(bG (n-1))
> end.
> )
> bG9 =: 'if. ''9:'' -: u lrA do. n else. (u tieA v) bG9 end.' daF
>
>
> 9: +: -@[ + bG9
> +--+---------+-+
> |+:|+-+-----+|+|
> | ||@|+-+-+|| |
> | || ||-|[||| |
> | || |+-+-+|| |
> | |+-+-----+| |
> +--+---------+-+
>
> 9: +: - ((+`) bG9) NB. "named adverb" (parens equivalent) with fixed 2nd
> parameter.
> +--+-+-+
> |+:|+|-|
> +--+-+-+
>
> +: - (+ bG 3) NB. fixed
> +--+-+-+
> |+:|-|+|
> +--+-+-+
>
> +: - (+ bG 3)`:6
> +: - +
> +: -`+ bG 2 `:6 NB. only 2 arguments, 1 a gerund.
> +: - +
>
> +: - ((+`)(bG 2))`:6 NB. parend adverb. 2 strand arguments again,
> because first will be "captured" by +`
> +: + -
>
> +: - (bG 2)`+ `:6 NB. bG and bG9 make gerunds and so can be combined
> with tie.
> +: - +
>
>
> another advantage of bG over bG9 and other multiadverbs is that a partial
> binding is very readable (and editable)
>
> -@[ bG 9
> (tieA(-@[))(bG 8)
> + -@[ bG9
>
> 2 : 'if. ''9:'' -: u lrA do. n else. (u tieA v) bG9
> end.'((<,'+'),<(<,'@'),<;:'-[')
>
>
> last batch of routines to make these tools usable in saved adverbs.
> aatrain is most important for creating modifier trains. It works by
> repeatedly executing its parts until it no longer evaluates to an adverb.
> A limitation is that modifier arguments (as strings-linear representations)
> to the "intended adverb" are not allowed. A feature is that the adverb
> train can be extended with "linear adverbs". The workaround for functions
> that take linear modifiers as parameters, is to encode them as strings
> inside gerunds, and convert them in the function itself. So G and G9 are
> included.
>
>
> ncA =: 1 : 'if. 3 ~: 4!:0 < ''u'' do. if. m ismodstring do. m ; ncS m
> else. 0 ;~ ''('', m lrA ,'')'' end. else. 3;~ ''('', u lrA ,'')'' end.'
>
>
> aatrain =: 0 daFx NB. perfectly solves the composability of double
> adverbs. But fails if modifier params included.
> if. 0 -.@-: 1{:: a =. v ncA do. n =. ,: a end.
> if. 1 = 1 {:: (;: inv {."1 a =.(u ncA , n)) ncA do. a aatrain else.
> (;: inv {."1 a) eval end.
> )
>
> G =: 2 : 0 NB. builds gerund. recurses until n = 0
> select. n case. 0 ;1;_1 do. u case. 2 do. tie u case. _2 do. (u tie)
> case. (;/ _2 - i.20) do. (u tie)(G (n+1)) case. do. ( tie u)(G (n-1)) end.
> )
> G9 =: 'if. ''9:'' -: u lrA do. n else. (u tie v) G9 end.' daF
>
> toG =: 1 : ' if. 1 2 e.~ 1 {:: u ncA do. a =. (m) eval else. a=.u end.
> 5!:1 < ''a''' NB.makes gerund from anything. string modifiers into gerund
> versions.
>
>
> tieD =: 'u tie v' daF
> tieDs =: 'v tie u' daF
> tieAD =: 'u tieA v' daF
> tieADs =: 'v tieA u' daF
>
>
> Fork as multiadverb
>
> +/ # % ('tieDs tieD (`:6)' aatrain) NB. Alternate def fhg (middle verb
> can be prebound)
> +/ % #
>
> F =: 'G 3 (`:6)'aatrain
> +/%# F
> +/ % #
> +: + +/ % # F F
> +: + +/ % #
>
> 2 + 3 F + ] F NB. extra capability
>
> 5 + ]
>
> +: +: 3 F NB. monad composition
> 12
>
>
> Composition adverb where first bound parameter is verb or conjunction. to
> work with aatrain, comp must take atomic noun(if conjunction), and then you
> also have to tie the modifier. But if simple composition is needed,
> manually inserting 2 adverbs is best.
>
>
> strinsert =: 1 : ' [ , u , ]'
> comp =: 1 : '((}:m)tieA (({:m) 5!:0))@.(_1 strinsert/ i.<:#m)'
>
> 9: - +/ +"2 '@' G9 comp
> -@(+/)@(+"2)
> - +/ +"2 '@' G 4 comp NB. manual composition helps reading.
> -@(+/)@(+"2)
>
> 9: - +/ +"2 tie '@' ('G9 comp' aatrain)
> -@(+/)@(+"2)
>
> 9: - +/ +"2 (+ +:) 'G9 comp' aatrain NB. tie not needed if verb
> composer
> - (+ +:) +/ (+ +:) +"2
>
>
> Overall it makes sense to have gerund functions that are independent of
> how you build the gerund especially if there are modifier parameters.
> Conjunctions that take gerunds on n are especially finicky. double adverb
> form makes writting them easier. the assert verb:
>
>
> c2da =: 1 : ( 'a =. (m ,'' u'') label_. 1 : (''u 1 :'' , quote a)')
> pow =: '^:' c2da
>
> 0 0 $13!:8 (0 e. ]) 12"_ tieD pow
> 0 0 $ 13!:8^:((0 e. ])`(12"_))
>
>
> "Gerund math" includes applying an adverb to multiple verbs, but more
> generally stitching 2 gerund arguments together. Advsert is not setup for
> trains as it uses direct gerunds of modifiers.
>
>
> Cloak =: (aar(0:`))(,^:)
> combG =: '(`:6)toG' Cloak
> Advsert=: 'if. -. v isgerundA do. n =. v toG end. (combG"1 m ,.(#m) $ n)'
> daF NB. 2 gerund arguments. n coerced to one if not.
>
> +`- '/' toG Advsert , tieD comp
> +/ , -/
> +`- '/' tieA '/\' Advsert , tieD comp
> +/ , -/\
>
> To solve a recent problem I posted regarding "recursive descent of monadic
> functions down a tree structure, first note the behaviour of $: in a gerund
> does not treat "same verb phrase" as including the verb in Gerund&verb, and
> so if you wish to recursively apply a gerund to a tree, you need the
> applying function to be an adverb.
>
> AltM =: 1 : '}.@:(((#m) # ,: }.@] ,~ [ , G 4) m ''(@{.)(@])'' Advsert
> Advsert/)@:({. , ])'
>
> +:`-: AltM NB. applies monad version of verb to head of y, appening x
> and rest of results on each iteration.
> }.@:((}.@] ,~ [ , +:@{.@])`(}.@] ,~ [ , -:@{.@])`:3)@:({. , ])
>
> +:`-: AltM 1 2 3 4
> 2 1 6 2
> (+:`-:AltM)("1)3 3$1 2 3 4
> 2 1 6
> 8 0.5 4
> 6 2 2
>
> NB. only works with lists, so
>
>
> > (+: ` -: 'each' Advsert AltM) <("1) 3 3$1 2 3 42 4 6
> 2 0.5 1
> 6 8 2
>
>
> for recursive parenthesizing,
>
>
> cutP =: ({:@] ,~ ]) <;._2~ 1 ,~ (] ~: 0 , }:)@:(1 <. ])@:(([: +/\
> =/\@(''''&~:) * 1 _1 0 {~ '()' i. ]) :([: +/\ =/\@(''''&~:)@] * 1 _1 0 {~
> i.))
>
> ] ]`$:@.('(' e. ;)@:cutP each tieD AltM cutP'qq((a(bd(c))g)gg(ffff))g'
>
> +--+---------------------------+-+
> |qq|++-------------+--+------++|g|
> | |||+-+-------+-+|gg|+----+||| |
> | ||||a|+--+-++|g|| ||ffff|||| |
> | |||| ||bd|c||| || |+----+||| |
> | |||| |+--+-++| || | ||| |
> | |||+-+-------+-+| | ||| |
> | |++-------------+--+------++| |
> +--+---------------------------+-+
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm