Search code examples
j

Write `4 : '$ x (<") y'` tacitly


How can I write the frame function tacitly? (From "Learning J" Ch 7)

I'm using the f x g y = x f@:g y composition scheme from Ch 8 , but it's not working. My guess is because <" has no natural rank?

x=.1
y=.i.2 3 4
f=.$
g=.<"

frame_e=.4 :'f x g y'
frame_t=.f@:g
x frame_e y         NB. -> 2 3, which is the x-frame of y
x frame_t y         NB. -> domain error

NB. No natural rank
g b.0               NB. -> syntax error
0 g b.0             NB. -> 0 0 0

I confirmed the pattern works as I expected with other functions.

x=.1
y=.i.2 3 4
f=.+/
g=.*

f x g y             NB. -> equiv of 12+2*i.3 4
x f@:g y            NB. -> same

Solution

  • Tacitly, I would do it using

       framet=. {. $
       2 framet i. 2 3 4
    2 3
    

    but that does not really get to the root of your question, does it?

    The issue is really the way that g is defined:

    g=.<"
    

    This does not make g a verb, but an adverb. It does use the x in the explicit definition to create a verb, but it needs to do this before it uses that verb to evaluate y. As far as I know, J does not allow you to stage these processes. As you have seen the pattern does work when f and g are actually verbs.

    I find tacit programming elegant, but it can be slower at some things and there are areas where it is limited.

    I am hoping that someone can provide a better answer, so that I may learn as well.