Thanks, Bill. And Raul. I started on General so I'll finish on General. But I think I can finish it here & now. I suggest further comments on calc.ijs take place on Programming forum.
I'm being silly. There's a simple answer to all this: >>> Move all the handler assignments to the bottom of the script. <<< I've done just that, and it cures all problems. IMO it's good practice to do so. Always nice to nudge a beginner towards good practice. The beginner infers good practice from the earliest examples s/he meets, and never replaces that notion, only shores it up in the light of experience (--findings from HF experiments by IBM in a joint project with Cambridge MRC Applied Psychology Unit in the early 80s). So... no asking J to resolve forward refs. A note in the script itself hints at why. Nothing need be said in the body of the article. Nothing dodgy-looking in the code or treatment to "skirt problems". J's deferred word resolution accommodates most situations, but it's not reasonable of anybody, even a beginner (lol!) to expect it to read your mind and decide in advance whether 'setop' in: calc_plus_button=: +setop is a verb or an adverb. (So... there is no bug, and never was.) And that, I think, is the message the article now conveys. I've replaced 'calc.ijs' with a finished script. It now behaves like most people's calculators and does + - * %. Thanks to Ric for improving it. The old calc is still there as: calc0.ijs, but it isn't referenced in the text. The article http://www.jsoftware.com/jwiki/JinaDay has been updated to reflect changed definitions. Thank you, one and all. Ian On Wed, Nov 3, 2010 at 3:42 PM, bill lam <[email protected]> wrote: > Using adverb like APL is easier to understand as such > +/ 1 2 3 > that evaluated into a noun. But it is a little bit tricky for > expressions like > insert=: / > sum=: + insert > > remember that J is an executable language, that means every sentence will > be executed once feed to J interpreter. So when J executes the second sentence > (sum=: + insert), it does not store the textual token for execution when > the verb 'sum' will be feed some noun. Instead this sentence is executed > right now by pulling the definition of 'insert' to construct an internal > representation that will no longer contain the name 'insert', and sum is > evaluated to +/ Even if the name 'insert' will be later changed to > anything else will not influence 'sum' which will always be +/ > > I don't think this has to be taught in day-1. > > Срд, 03 Ноя 2010, Ian Clark писал(а): >> I was sending calcic2.ijs to you as a pm, Ric, but then thought the >> forum ought to be brought in. >> >> But having uploaded it to the JinaDay page, like you were doing, I >> simply forgot to detach the attachment. >> >> Looks like Bill has put his finger on it. I guessed it had something >> to do with deferred definition. It worried me that typing this into >> IJX... >> plus=: + in >> executed 'in' at assignment time, not when 'plus' was run by the handler. >> (Maybe this part of the discussion should be moved to Programming forum?) >> >> Umm... I don't think this is an area I want to get into, except as >> part of a masterclass. Something for JtheMorningAfter. Certainly not >> in a peace-offering to unregenerate APLers, who won't need much >> convincing that J is touchy where adverbs are concerned. NOt the >> message I want to send. >> >> How to finesse this in JinaDay? Ought I to say? ... >> >> "Don't push the gui too hard, to make it read your mind." >> (...viz. that 'in' is going to be defined later as an adverb, not a verb) >> >> "With enough explicitly-defined cover functions you can get round most >> problems, 'cos those bind at execution time." >> >> "Only assign safe monadic verbs to handlers, until you know what you're >> doing" >> (...like I dont, lol) >> >> Or ought I to shut the door on the whole topic -- and not provoke >> novices with code teetering on the brink of complex issues? >> >> I do so want to give a natural-looking example where a user-defined >> adverb would really be useful, and invoke it tacitly, to show APLers >> there's nothing to be afraid of. >> >> Ian >> >> >> On Wed, Nov 3, 2010 at 8:51 AM, Sherlock, Ric <[email protected]> >> wrote: >> > Ian, >> > >> > I was surprised when I saw your attachment in the forum, I had thought >> > that the forum didn't accept them. Doesn't look like it accepted mine. I >> > will send it to you directly. >> > Ric >> > >> >> -----Original Message----- >> >> From: [email protected] [mailto:general- >> >> [email protected]] On Behalf Of Sherlock, Ric >> >> Sent: Wednesday, 3 November 2010 21:30 >> >> To: General forum >> >> Subject: Re: [Jgeneral] "J In A Day" --crits please >> >> >> >> I think Bill is right, >> >> Options are to make sure adverb definition is before tacit handler >> >> definition or make the handler definition explicit. The attached shows >> >> both approaches. >> >> >> >> Also: >> >> Seems that acc should be ACC to be consistent with NEWNUMBER . >> >> Moved initialization of ACC and op to clr . >> >> Seems pointless to bind numeric digits to digit and convert them to >> >> character. >> >> 8!:2 automatically converts _ to - . >> >> >> >> >> >> >> >> > From: Ian Clark >> >> > Sent: Wednesday, 3 November 2010 15:59 >> >> > >> >> > Hi Ric, >> >> > >> >> > Thanks for helping to extend calc.ijs. >> >> > I've been developing in parallel with yours, but have raided some of >> >> > your verbs, which are neater than mine. The result is uploaded same >> >> > place as yours (attachments: JinaDay) as: calcic2.ijs >> >> > >> >> > It has a full range of + - * / buttons, implemented with (verb): >> >> > setop, which I feel is a little clunky. Out of interest I've tried a >> >> > neater alternative, an adverb called: in, so I can use +in, -in, etc. >> >> > It would be a nice demo of adverbs returning verbs. But I think I've >> >> > hit a J bug... >> >> > >> >> > This works fine: >> >> > calc_times_button=: doit >> >> > >> >> > ...where doit is defined, as in the script, _after_ the definition >> >> of: >> >> > in as: >> >> > doit =: *in >> >> > >> >> > But this doesn't (it upsets the gui somehow): >> >> > calc_times_button=: * in >> >> > >> >> > Nor does this: >> >> > doit =: *in >> >> > calc_times_button=: doit >> >> > >> >> > Can you see what I'm doing wrong? I can't. >> >> > >> >> > Ian >> >> > >> >> > >> >> > On Wed, Nov 3, 2010 at 1:10 AM, Sherlock, Ric >> >> > <[email protected]> wrote: >> >> > > Further update to calc2.ijs: >> >> > > >> >> > > Altered button order/layout. >> >> > > >> >> > > Moved NEWNUMBER=: 1 to update rather than repeating in each >> >> operation >> >> > button. >> >> > > >> >> > > Ends up highlighting another gotcha for new users: >> >> > > If you define a verb whose result is a verb, adverb or conjunction >> >> > then J will report a syntax error when the verb runs. If no result is >> >> > required then a common solution is to add an extra line that returns >> >> > "empty" (i.0 0) >> >> > > >> >> > >> From: Sherlock, Ric >> >> > >> Sent: Wednesday, 3 November 2010 12:55 >> >> > >> >> >> > >> Yes, when I got around to testing in a clean session I had noticed >> >> > that >> >> > >> too. >> >> > >> The latest version on the wiki initializes them. >> >> > >> >> >> > >> > From: Ian Clark >> >> > >> > Sent: Wednesday, 3 November 2010 12:52 >> >> > >> > >> >> > >> > I get value errors for op and acc on starting up, unless I >> >> > initialise >> >> > >> > them in calc_run. >> >> > >> > >> >> > >> > On Tue, Nov 2, 2010 at 9:55 PM, Sherlock, Ric >> >> > >> > <[email protected]> wrote: >> >> > >> > > I've made some more "improvements" to calc2.ijs. Includes "-" >> >> > >> button. >> >> > >> > > Adding additional operations should be trival. >> >> > >> > > Renamed the verb "clear" to "clr" so that clear_z_ is still >> >> > easily >> >> > >> > useable. >> >> > >> > > >> >> > >> > > I use the TortoiseMerge app to do diffs between similar >> >> versions >> >> > of >> >> > >> a >> >> > >> > script. I'm sure you have your own favourite. >> >> > >> > > >> >> > >> > > Ric >> >> > >> > > >> >> > >> > >> From: Of Ian Clark >> >> > >> > >> Sent: Tuesday, 2 November 2010 17:12 >> >> > >> > >> >> >> > >> > >> Thanks for calc2, Ric. >> >> > >> > >> >> >> > >> > >> I'll have to study it closely because it's much like my own >> >> > >> > extension, >> >> > >> > >> but not exactly so. >> >> > >> > >> >> >> > >> > >> I also feel that buttons for the remaining ops are needed >> >> now, >> >> > and >> >> > >> > >> that this needn't complicate the demo too much. In fact with >> >> > the >> >> > >> use >> >> > >> > >> of 'bind' (and I was confusing 'bind' and Bond but you didn't >> >> > say >> >> > >> > >> anything) my demo has become if anything too simple to >> >> > illustrate >> >> > >> > what >> >> > >> > >> I originally wanted to. >> >> > >> > >> >> >> > >> > >> Ian >> >> > >> > >> >> >> > >> > >> >> >> > >> > >> On Tue, Nov 2, 2010 at 2:15 AM, Sherlock, Ric >> >> > >> > >> <[email protected]> wrote: >> >> > >> > >> >> From: Ian Clark >> >> > >> > >> >> Sent: Tuesday, 2 November 2010 09:33 >> >> > >> > >> >> >> >> > >> > >> >> > I agreed with Brian that I missed the "equals" button in >> >> > the >> >> > >> > >> original >> >> > >> > >> >> calc.ijs. Now I miss the "plus" button. It seems >> >> unintuitive >> >> > to >> >> > >> > >> press >> >> > >> > >> >> "=" when you want to add. >> >> > >> > >> >> >> >> > >> > >> >> Hahaha! (Can't please everybody.) Can I interest you in a >> >> > more >> >> > >> > >> >> advanced calculator? It's called J ... :-) >> >> > >> > >> >> >> >> > >> > >> >> I'm just glad I wasn't on the design team of the original >> >> > >> pocket >> >> > >> > >> >> calculator. It's subtler than it looks. >> >> > >> > >> >> >> >> > >> > >> >> Providing both '+' and '=' buttons means adding a whole >> >> row >> >> > or >> >> > >> > >> column >> >> > >> > >> >> of buttons or it looks untidy. I've a calc with the >> >> > >> conventional >> >> > >> > >> >> look'n'feel -- but IMO it's too complex to serve as a good >> >> > >> demo. >> >> > >> > >> >> >> >> > >> > >> > >> >> > >> > >> > I've attached an alternative layout to the JinaDay wiki >> >> page >> >> > >> > (named >> >> > >> > >> calc2.ijs) that includes separate '=' and '+' buttons. There >> >> > are >> >> > >> > also >> >> > >> > >> some minor changes to some of the verbs to make it work more >> >> > like >> >> > >> my >> >> > >> > >> calculator and make it easier for users to add other >> >> operation >> >> > >> > buttons. >> >> > >> > >> See if you think that works/looks OK. >> >> > >> > >> > >> >> > >> > >> >> > The current phrasing of your "blasphemous comment" has >> >> > more >> >> > >> > impact >> >> > >> > >> >> but I get the feeling that your actual message is more >> >> like: >> >> > >> > "There >> >> > >> > >> is >> >> > >> > >> >> no need to get your head around tacit definition". The >> >> fact >> >> > is >> >> > >> > that >> >> > >> > >> >> many of the button handlers in the calc script use tacit >> >> > code! >> >> > >> I >> >> > >> > >> >> suppose it comes down to whether you think that being >> >> > >> provocative >> >> > >> > >> >> rather than reassuring will help get your message across >> >> > best. >> >> > >> > >> >> >> >> > >> > >> >> "Here Be Dragons..." >> >> > >> > >> >> >> >> > >> > >> >> I meant to be reassuring by being provocative. Reassuring >> >> > (to >> >> > >> > >> APLers) >> >> > >> > >> >> by being (or, rather, risking being) provocative to J-ers. >> >> > >> > >> >> >> >> > >> > >> >> De-mystifying a topic is never free from the insinuation >> >> > that >> >> > >> the >> >> > >> > >> >> mystery is intentional: or at the very least, serving >> >> > someone's >> >> > >> > >> >> purpose. People are quite smart, you know. If a mystery >> >> > serves >> >> > >> no >> >> > >> > >> >> purpose -- or no one's purpose -- it soon gets cleared up. >> >> > It >> >> > >> > >> follows >> >> > >> > >> >> that de-mystification is apt be viewed as de-bunking. >> >> > >> > >> >> >> >> > >> > >> >> It wasn't my intention to debunk. Simply to cast some >> >> light. >> >> > >> > Maybe >> >> > >> > >> to >> >> > >> > >> >> let in some fresh air. >> >> > >> > >> >> >> >> > >> > >> >> On first encountering APL my initial response was to feel >> >> > >> > >> inadequate. >> >> > >> > >> >> I should have felt humble, but instead I felt humiliated. >> >> > >> Because >> >> > >> > at >> >> > >> > >> >> the time I was masquerading as a "computer scientist", ie >> >> an >> >> > >> > expert. >> >> > >> > >> >> This was back in 1973, when the industry was less >> >> > fragmented. >> >> > >> It >> >> > >> > was >> >> > >> > >> >> "IBM and the Seven Dwarfs" -- and I was IBM. >> >> > >> > >> >> >> >> > >> > >> >> So I looked for holes. For excuses to label APL as mad, >> >> not >> >> > >> > >> brilliant. >> >> > >> > >> >> Then I'd be exposed as sane, not stupid. It reassured me >> >> to >> >> > >> swap >> >> > >> > sly >> >> > >> > >> >> remarks about the language, especially as others felt the >> >> > same >> >> > >> as >> >> > >> > I. >> >> > >> > >> >> >> >> > >> > >> >> On first encountering J, I experienced the selfsame >> >> feeling >> >> > I >> >> > >> had >> >> > >> > on >> >> > >> > >> >> first meeting APL. It largely revolved around "tacit >> >> > >> > programming". >> >> > >> > >> >> Attempts by those who'd Seen The Light to motivate me by >> >> > saying >> >> > >> > >> "it's >> >> > >> > >> >> really quite easy" -- or -- "it's far better than APL >> >> doing >> >> > it >> >> > >> > this >> >> > >> > >> >> way" simply provoked hostility. And not just in me, I >> >> > observed. >> >> > >> > >> >> >> >> > >> > >> >> So there was a barrier to surmount, before I could >> >> > contemplate >> >> > >> J >> >> > >> > >> >> equably, let alone consider using it myself for a serious >> >> > task. >> >> > >> > >> >> >> >> > >> > >> >> Tacit programming _isn't_ "really quite easy". In >> >> principle, >> >> > >> > >> maybe... >> >> > >> > >> >> But in practice it's as much a strain as coding in 68000 >> >> > ASM. >> >> > >> > (Yes, >> >> > >> > >> >> done that -- and sold the result). >> >> > >> > >> >> >> >> > >> > >> >> And that, I think, is the way to look at it. Those who can >> >> > do >> >> > >> it >> >> > >> > can >> >> > >> > >> >> justly be proud of their skill. But nobody is ashamed of >> >> not >> >> > >> > being >> >> > >> > >> >> able to compose 68000 machine code in their heads without >> >> > >> > computer >> >> > >> > >> >> assistance, so why should they be when it's tacit J? >> >> > >> > >> >> >> >> > >> > >> >> There is this difference. Machine-code is best kept >> >> beneath >> >> > the >> >> > >> > >> >> covers. But tacit J beneficially seeps out. As you >> >> observe, >> >> > >> > there's >> >> > >> > >> >> tacit code in calc.ijs. >> >> > >> > >> >> >> >> > >> > >> >> IMO the issue over tacit J is not whether we should banish >> >> > >> > (digit&1) >> >> > >> > >> >> from calc.ijs, but whether we should aim to make novices >> >> > >> ashamed >> >> > >> > of >> >> > >> > >> >> writing: >> >> > >> > >> >> quo=: 3 : 'Q,(":>y),Q' NB. place datum in quotes >> >> > >> > >> >> instead of: >> >> > >> > >> >> quo=: Q , Q ,~ [: ": > >> >> > >> > >> >> because that, I think, has been counter-productive. >> >> > >> > >> >> >> >> > >> > >> >> They'll do so in the end... and like as not they won't >> >> know >> >> > >> > they're >> >> > >> > >> >> doing it. >> >> > >> > >> > >> >> > >> > >> > I agree that it is counterproductive to denigrate the use >> >> of >> >> > >> > explicit >> >> > >> > >> definition. I don't think that happens really, although I >> >> know >> >> > >> that >> >> > >> > a >> >> > >> > >> lot of code on the forums is tacit. As I said recently on >> >> > >> > comp.lang.apl >> >> > >> > >> I think this is really just a side effect of more experienced >> >> > >> users >> >> > >> > >> thinking and working more in tacit mode. >> >> > >> > >> > >> >> > >> > >> > I remember when I started learning J that I pretty much >> >> > >> "ignored" >> >> > >> > >> trying to create tacit verbs - I was content to stick with >> >> > >> explicit. >> >> > >> > I >> >> > >> > >> found the tacit code on the forum hard to read/understand. I >> >> > think >> >> > >> > my >> >> > >> > >> biggest hurdle in coming to terms with tacit was being able >> >> to >> >> > >> > reliably >> >> > >> > >> identify the parts of speech for J's various primitives (verb >> >> > vs >> >> > >> > adverb >> >> > >> > >> vs conjunction). Without that knowledge it is hard to >> >> identify >> >> > the >> >> > >> > >> composed verbs and correctly separate the hooks from the >> >> forks. >> >> > As >> >> > >> I >> >> > >> > >> learnt the J primitives and their parts of speech, suddently >> >> > tacit >> >> > >> > >> didn't seem so hard after all, and now I find myself using it >> >> > in >> >> > >> > >> preference to explicit for many sentences. >> >> > >> > >> > >> >> > >> > >> > Having said that I'd be more inclined to promote the use >> >> this >> >> > >> form >> >> > >> > >> than the one liner string form above. Otherwise things can >> >> get >> >> > >> messy >> >> > >> > >> when dealing with strings. >> >> > >> > >> > quo=: 3 : 0 >> >> > >> > >> > Q,(":>y),Q >> >> > >> > >> > ) >> >> > >> > >> > >> >> > >> > >> > Ric >> >> > >> > >> > ----------------------------------------------------------- >> >> -- >> >> > --- >> >> > >> -- >> >> > >> > --- >> >> > >> > >> - >> >> > >> > >> > 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 >> >> > >> ------------------------------------------------------------------ >> >> -- >> >> > -- >> >> > >> 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, > ==================================================== > GPG key 1024D/4434BAB3 2008-08-24 > gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3 > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
