Glad it helped. Adverbs are indeed some kind of higher-order function. But depending on other programming languages you've used and other expectation-setting experiences, some nuances may be surprising.
-Dan -----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of Alexander Epifanov Sent: Thursday, June 13, 2013 11:24 PM To: [email protected] Subject: Re: [Jchat] "|value error: m | x m write_jpeg y" - what??? Thank you Dan, I am sure that explanation was perfect. But I passed first part, because it is clear what adverb is: some kind of high order function. The most important for me was explanation how J process expression in this case. Regards, On Thu, Jun 13, 2013 at 2:36 PM, bob therriault <[email protected]>wrote: > Hi Dan, > > You explain things beautifully in your medium of choice (but I would > hardly think of you as stuck in text) and if you do want to add some > other media at some point, let me know. > > I think that your related pet peeve is a result of media not matching > its audience. You want a sound bite, but you are given a lecture. If > you combined a series of short videos to be displayed beside text, you > would have structured the sound bites to a form that would be closer > to your needs. In the text world, you might consider this related to > the effect of white space on the structure of your writing. It is a > matter of packaging more than a matter of content, but it can affect > comprehension and retention. > > I believe Ian Clark was pushing for this in the short animations he > was using in new vocab a few years ago. > > http://www.jsoftware.com/jwiki/NuVoc with > http://www.youtube.com/v/aTRONIqXFVI as an example of a short form > video > > In any case, your ability to explain is a valuable commodity in the > world of J (or any other programming language). I look forward to your > future contributions. > > Cheers, bob > > On 2013-06-13, at 10:45 AM, Dan Bron wrote: > > > Yes, I remember your video series warmly. Personally, I'm stuck in > > the > text age. I don't have the tools or ambition to go multimedia. > > > > (And a related pet peeve is when I click through a news story or > > other > link and am presented with a video, which can only be scanned > linearly, as opposed to text, which is random access.) > > > > -Dan > > > > -----Original Message----- > > From: [email protected] [mailto: > [email protected]] On Behalf Of bob therriault > > Sent: Thursday, June 13, 2013 1:09 PM > > To: [email protected] > > Subject: Re: [Jchat] "|value error: m | x m write_jpeg y" - what??? > > > > Great explanation Dan, > > > > A couple of years ago I put this video together about the adverb '~' . > > > > http://bobtherriault.wordpress.com/2010/11/17/those-tricky-adverbs/ > > > > Let me know if you have any interest in developing your explanations > into a more multimedia mode. I don't have huge amounts of time (and it > does take some time), but I do enjoy doing this stuff. > > > > Cheers, bob > > > > On 2013-06-13, at 9:48 AM, Dan Bron wrote: > > > >> Alexander Epifanov wrote: > >>> but I did not understand what is the different, I mean how it > >>> works if it is adverb. > >> > >> To understand this error, we must first discuss what adverbs are, > >> how they behave, and how they differ from verbs. So let's start there. > >> > >> ---------- > >> Adverbs are a different class, or order, of words than verbs. In > >> particular, they have higher grammatical precedence than verbs, and > >> so gobble up any suitable arguments lying around before verbs can > >> even see them. Conjunctions are in this same high-precedence > >> class, but whereas adverbs only take one argument (on the left), > >> conjunctions take two (one on the left, the other on the right). > >> You can think of adverbs and conjunctions as higher-order analogs > >> to monadic and dyadic verbs > >> respectively.* > >> > >> Adverbs are called adverbs because they normally modify verbs: that > >> is, in typical use, they accept a verb argument and produce verb > >> result, which is related in some (consistent) way to the argument. > >> The most famous example is / : > >> > >> +/ 2 3 4 NB. Sum of data (Σ s[i]) > >> */ 2 3 4 NB. Product of data (Π s[i]) > >> ^/ 2 3 4 NB. Tetration ("power tower") of data > >> > >> Here, / takes a dyad (two-argument verb) as an argument, and > >> produces a monad (one-argument verb)*. The output is related to > >> the input in the following sense: when the output verb is provided > >> an noun, it inserts the input verb between each pair of items in > >> the noun, such > that: > >> > >> +/ 2 3 4 is 2+3+4 > >> */ 2 3 4 is 2*3*4 > >> ^/ 2 3 4 is 2^3^4 NB. Note: J executes right-to-left, so > >> this is 2^(3^4) > >> > >> and > >> > >> +/ 2 3 4 , 5 6 7 ,: 8 9 10 > >> is: > >> 2 3 4 > >> + > >> 5 6 7 > >> + > >> 8 9 10 > >> > >> which, because + is rank 0 (scalar), is: > >> > >> 2 3 4 > >> + + + > >> 5 6 7 > >> + + + > >> 8 9 10 > >> > >> etc. > >> > >> But bear in mind that taking verb arguments and deriving > >> (consistently) related verbal results is only the typical case for > >> an adverb. Adverbs can also take a noun for an argument (an > >> "adjective"); the most common example is } , which normally takes > >> a noun argument specifying which indices the derived verb should > >> modify > (when it, itself, is applied to nouns): > >> > >> putFirst =: 0} > >> putLast =: _1} > >> putFirstAndLast =: 0 _1} > >> > >> '*' putFirst '12345' > >> *2345 > >> '*' putLast 'ABCDE' > >> ABCD* > >> '*' putFirstAndLast 'ABCDE' > >> *BCD* > >> > >> So adverbs can take verbs or nouns as inputs, and normally produce > >> verbs as outputs. But adverbs are not restricted to verbal output; > >> they can produce anything, including verbs, nouns, and even other > adverbs and conjunctions. > >> Primitive adverbs which produce non-verb results are unusual > >> (primitive conjunctions are a little more diverse in this regard), > >> but they exist. For example, when the adverb ~ is applied to a > >> string, it treats the string in as a name and evokes it, such that > >> 'someName'~ is equivalent to someName . Therefore ~ can produce anything > >> at all: > >> > >> someNoun =: 42 > >> someVerb =: + > >> someAdverb =: / > >> someConjunction =: @ > >> > >> 'someNoun'~ > >> 42 > >> 'someVerb'~ > >> + > >> 'someAdverb'~ > >> / > >> 'someConjunction'~ > >> @ > >> > >> > >> Of course user-defined adverbs will produce anything they're > >> defined to produce, so you can't know what they'll do without > >> reading the definition or documentation. That said, user-defined > >> adverbs tend to follow the same patterns as primitive adverbs: > >> they're almost always abstractions over verbs which produce verb > >> results; sometimes they take noun arguments and/or produce noun > >> results, and only very rarely do they produce other adverbs or > >> conjunctions. > >> > >> Ok, with that as a background, we're ready to discuss write_image > >> and the error you observed. > >> > >> --------------- > >> > >> The word write_image falls into this "user defined adverb" category. > >> The reason it was defined as an adverb instead of a verb is so that > >> it can accept up to 3 arguments (filename, data to write, and a set > >> of options like image quality or scaling), whereas if it were > >> defined as a verb, it could accept no more than two arguments. > >> Meaning if write_image had been defined as a verb, it would have to > >> find some way to pack two arguments into a single noun, and unpack > >> them inside the definition, which can sometimes lead to convoluted > >> code. Keeping it as an adverb with three distinct arguments is very clear > >> and clean. > >> > >> But it does stymie attempts to use it like a verb, as you discovered. > >> In particular, when you embedded it in > >> > >> (('small/'&, (write_image)~ ((3 > >> 3)&resize_image)@:read_image)@:>) i > >> > >> , its higher grammatical priority caused the adverb to seek out an > >> argument immediately, and since the verb 'small/'&, was on its left > >> and suitable (because verbs are perfectly acceptable arguments for > >> adverbs), the result was that write_image bound with 'small/'&, . > >> Now, the specific coding style** of write_image prevented it from > >> being executed immediately (if it'd been executed, you'd know it, > >> because you would have gotten an error: write_image is expecting > >> data [a noun] as an argument, not a verb like 'small/'&,), but it > >> also allowed the J interpreter to infer that when it is executed, > >> it will > produce a verb. > >> > >> So write_image woke up, looked around for an argument, found > >> 'small/'&, , bound with it, and though it didn't actually execute, > >> the J interpreter knew its product would be a verb. Knowing this, > >> J proceeded parsing the sentence, found another verb ((3 > >> 3)&resize_image)@:read_image)@:>, and hit a close paren. Since it > >> had found two verbs in isolation (nestled inside a cozy pair of > >> parens), it interpreted the train as a hook. This is really no > >> different from the sentence (%~ i.) 10 where ~ immediately binds > >> to %, the product of > that binding and i. form a hook. > >> > >> After forming the hook, the interpreter it hit the noun i and > >> applied > the > >> hook as ('small/'&,write_image~ 3 3&resize_image@:read_image)@:> > i . > >> The interpreter executed 3 3 resize_image read_image > i and got a > result. > >> Up to this point, everything was fine. But now it came time to use > >> the results it had calculated, and actually execute write_image . > >> That's where the problem occurred: and it was exactly the error I > >> mentioned earlier, that the interpreter avoided by deferring the > >> execution of write_image (you can delay the inevitable, but you > >> can't > avoid it). > >> > >> That adverb was written expecting that its argument be a noun, and > >> refers to m, which is the name for the noun argument to an adverb > >> (or > conjunction). > >> But given how you expressed your sentence, in this case argument to > >> write_image was a verb: 'small/'&, . Therefore m (the name for a > >> noun argument to an adverb) was undefined, yet write_image tried to > >> use it anyway. > >> > >> J calls the use of undefined names a "value error". This is the same > error > >> as when you type > >> > >> someNameIHaventDefinedYet > >> |value error: someNameIHaventDefinedYet > >> > >> in the session manager. > >> > >> But a closer analogy is the value error you'd get if you tried to > >> use x (which names a left argument) in a monadic verb which only > >> has a right > >> argument: > >> > >> monad def 'x + y' 4 > >> |value error: x > >> | x+y > >> > >> You get a value error because x is undefined, and x is undefined > >> because monadic (valences of) verbs don't have the concept of a > >> left > >> argument: x is literally meaningless. > >> > >> Similarly, when write_image referred to the noun argument m, the J > >> interpreter balked: "What noun argument? Your argument is a verb, > >> 'small/'&, . I don't know what you're talking about." . The name > >> for the > >> (non-existent) noun argument to write_image, m, was literally > meaningless. > >> All because adverbs have higher precedence than verbs and can > >> accept verbs as well as nouns as arguments. > >> > >> Well, actually, because Cliff decided to define write_image as an > >> adverb so he could have three separate arguments, without boxing. > >> I know that's a lot to digest. I'm not known for my laconic style > >> (cf Roger Hui), but I hope this helps. > >> > >> -Dan > >> > >> * Technically, all verbs in J are ambivalent; that is, they can be > >> called with either one argument (on the right) or two arguments > >> (one on the right, and one on the left). The words > >> "monad"/"monadic" and "dyad"/"dyadic" are just shorthand for the > >> "one-argument valence of the verb" and "the two argument valence of the > >> verb" respectively. > >> > >> Note that some valences of some verbs have empty domains, such as > >> the dyad ~. or the monad E. or the monad 4 : 'x + y' etc. That > >> doesn't mean the valence doesn't exist; it does exist, but it > >> rejects all arguments (a generalization of the concept that e.g. + > >> rejects any argument that's not a number). > >> > >> Now adverbs and conjunctions (collectively called operators) are > >> analogous to the monadic and dyadic valence of a verb respectively, > >> but it is exactly because of their higher grammatical precedence > >> that there is no operator analog to an ambivalent verb. That is, > >> there is no operator that can take either one argument or two arguments. > >> Operators' higher binding power requires that we treat these cases > >> separately - and, incidentally, is the reason adverbs (monadic > >> operators) take their argument from the left, as opposed to monadic > verbs which take their argument from the right. > >> > >> ** The specific coding style that allowed the J interpreter to > >> conclude write_image would produce a verb without actually > >> executing it was that it mentioned x and y - which, by definition, > >> refer to the noun arguments to an explicit verb. Therefore > >> write_image must produce an explicit verb, and x and y refer to /its/ > >> arguments. > >> > >> > >> > >> > >> ------------------------------------------------------------------- > >> --- 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 > -- Regards, Alexander. ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
