No idea whether to post on old or new wiki.

This utility shows all of the intermediate results (of verb phrases) in a tacit 
verb.  It uses my strand/multiadverb notation under the hood, and so the verb 
9: is reserved.  This should probably work in J6 and J7 too.

(not counting utilites).  everything one line except lrT aatrain evaleach


pD_z_ =:  1!:2&2
lrA_z_ =: 1 : '5!:5 < ''u'''
eval_z_ =: 1 : ' a: 1 :  m'


lrX =: 1 : ('''('', u lrA , '') '' , lr y';':';'''('', (lr x) , '') ('' , u lrA 
, '') '' , lr y')
evaly =: 3 : 'y eval lrA'  NB. removes 1 level of parens from lrT boxes
lvProcsRestT =: (1 : '( 0 {:: {: m) eval }: m') 



AmbiD =: 1 : 'u [ ''    '' pD@, u lrX'
strbracket =: (0&{@:[ , ] , 1&{@:[)
ismodstring =: 1 : 'if. 0 = 4!:0 <''u'' do. try. q =.  m eval catch. 0 return. 
end. 1 2 e.~ 4!:0 <''q''else. 0 end. ' 
ncS=:3 :'z=.y 1 :y label_. 4!:0 <''z'' ' :: _2: NB. nameclass of string 
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.'
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 arg 


forkorder=:($:@(2&}.) , {. , <)`(2&}. , {. , <)@.(3 = #)^:(1 ~: #) 
trainorder=: forkorder`($:@(1&}.) , <)@.(0 = 2 | #)

lrT =: 0 daFx 
if. 0 -.@-: 1{:: a =. v ncA do. n =. ,: a end. 
if. '9:' -: u lrA do. n else. 
(u ncA , n) lrT  end. 
) 


aatrain =: 0 daFx  NB. perfectly solves the composability of double adverbs 
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. 
)

evaleach =: 1 : 0 
for_i. m do. pD^:(i_index < <:#m) (i eval) :: ((i eval)@:]) y end. 
: 
for_i. m do. pD^:(i_index < <:#m) x (i eval) :: ((i eval)@:]) y end. 
)



strandT =: ([: ,&' AmbiD'@:('()'&strbracket)@:evaly@:; L:1   [: >@{.L:1 [: (#~ 
(<1) ~: (0-:1&{::)L:1)  trainorder@:(<"_1)) 'lrT lvProcsRestT evaleach' aatrain

dX =: lrA  1  : '(''9: '', m , '' strandT'') eval'


the display is offset (doesn't show up in email) to ease copying it to markdown 
and lower clutter.  Note that dX does not tunnel into "subtrains"

4 5 6 (([: |: ,:) #~ 1 < -:@])dX 1 2 3 
(4 5 6) (-:@]) 1 2 3 
0.5 1 1.5 
(4 5 6) (1 < -:@]) 1 2 3 
0 0 1 
(4 5 6) ([: |: ,:) 1 2 3 
4 1 
5 2 
6 3 
(4 5 6) (([: |: ,:) #~ 1 < -:@]) 1 2 3 
6 3 


but you can go directly to a subtrain line of interest and add dX to it and 
enter twice to get the display.  Result of dX is same as fork result so you can 
extend it to the left using its result.  (also the last expression display is 
also the origninal command, so you can just use that line to edit/repeat)

+:   (4 5 6) ([: |: ,:)dX 1 2 3 
(4 5 6) (,:) 1 2 3 
4 5 6 
1 2 3 
(4 5 6) ([:) 1 2 3 
(4 5 6) ([:) 1 2 3 
(4 5 6) ([: |: ,:) 1 2 3 
8 2 
10 4 
12 6 


though, if you want the display, you can extend it within the fork

  (4 5 6) ([: +: [: |: ,:)dX 1 2 3 
(4 5 6) (,:) 1 2 3 
4 5 6 
1 2 3 
(4 5 6) ([:) 1 2 3 
(4 5 6) ([:) 1 2 3 
(4 5 6) ([: |: ,:) 1 2 3 
4 1 
5 2 
6 3 
(4 5 6) ([:) 1 2 3 
(4 5 6) ([:) 1 2 3 
(4 5 6) ([: +: [: |: ,:) 1 2 3 
8 2 
10 4 
12 6 



 tiny flakiness when [: is in train




NB. dyadic hooks will show weird intermediate results, but hopefully not crash 
(use forks :P)


(#~ 1 < -:)dX 1 2 3 
>>> (1 < -:) 1 2 3 
0 0 1 
>>> (#~ (1 < -:)) 1 2 3 
3 


4 5 6 (#~ 1 < -:)dX 1 2 3 
>>> (4 5 6) (1 < -:) 1 2 3 
0 
>>> (4 5 6) (#~ (1 < -:)) 1 2 3 
6 
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to