Further aside: "function definition" might have been a bad choice of words, because it could be confused with:
(defun f (x y) (+ x y)) It's not easy to talk about these things in a simple and consistent fashion. -- Raul On Sun, Feb 1, 2015 at 11:21 PM, Raul Miller <[email protected]> wrote: > On a related note, lambda syntax is not really simple. > > Consider: > > ((lambda (x y) (+ x y)) 2 3) > 5 > > There are four left parenthesis here, and counting from left to right: > > The first left parenthesis marks the beginning of a function > application (what a J programmer might call a noun phrase). > > The second left parenthesis marks the beginning of a function > definition (what a J programmer might call a verb phrase). > > The third left parenthesis marks the beginning of an argument list (J > uses implicitly named arguments or unnamed arguments, but you can > achieve something analogous on the left hand side of =:) > > The fourth left parenthesis marks the beginning of a function definition. > > So what's the consistent system here? > > On a related note, (lambda (x y) (+ x y)) by itself would still be a > function definition. However, (x y) by itself would not be an argument > list. > > To make sense of this all you have to introduce another level of > abstraction (which might be called a macro system). And this is a > slippery slope which carries with it all sorts of other implications. > > Anyways, "lambda" is a leaky abstraction - I guess maybe all > abstractions leak to some degree. > > That said... I started working on an sexpr parser, and I ran into what > looks like an interpreter bug: > > LPAR=: {.;:'(' > RPAR=: {.;:')' > > parsexpr=:3 :0 > tokens=:;:y > ({.tokens) parsexpr }.tokens > : > if. x-:LPAR do. > assert. 0<#y > 'a d'=. t=.({.y) parsexpr }.y > smoutput t > assert. ({.d)-:RPAR > d=.}.d > if. #d do. > (<a),<({.d) parsexpr }.d > else. > a: > end. > else. > if. 0<#y do. > if. ({.y)-:RPAR do. > smoutput t=.(x,a:),&< y > t return. > else. > x,<({.y) parsexpr }.y > end. > else. > x > end. > end. > ) > > parsexpr '((lambda (x y) (+ x y)) 2 3)' > ┌────┬─────────────────────┐ > │┌─┬┐│┌─┬─┬─┬─┬─┬─┬─┬───┬─┐│ > ││y││││)│(│+│x│y│)│)│2 3│)││ > │└─┴┘│└─┴─┴─┴─┴─┴─┴─┴───┴─┘│ > └────┴─────────────────────┘ > ┌─┬────────────────────────────┐ > │x│┌────┬─────────────────────┐│ > │ ││┌─┬┐│┌─┬─┬─┬─┬─┬─┬─┬───┬─┐││ > │ │││y││││)│(│+│x│y│)│)│2 3│)│││ > │ ││└─┴┘│└─┴─┴─┴─┴─┴─┴─┴───┴─┘││ > │ │└────┴─────────────────────┘│ > └─┴────────────────────────────┘ > |assertion failure: parsexpr > | ({.d)-:RPAR > > Now I feel sad. > > -- > Raul > > > On Sun, Feb 1, 2015 at 6:30 PM, Jose Mario Quintana > <[email protected]> wrote: >> There are, in my mind, at least two potential reasons: >> >> 0. Quoting code can be annoying (when quoting quoted code, etc.) but the >> quoted code becomes a noun and fits within the current relatively simple >> parsing rules mold. It is virtually certain that balanced symbols could be >> used to implement a modified explicit syntax ( see, >> http://www.jsoftware.com/pipermail/programming/2009-December/017425.html ); >> but, new punctuation and parsing rules would have to be introduced. >> Arguably, lambda style syntax could also be implemented but it would >> require even more complications. >> >> 1. Lambda style syntax is unnecessary for tacit programming (functional >> programming without reference to argument names). Backus himself noted >> that APL introduced new functional forms which do not depend on lambda >> expressions. J enriched the functional forms further and the tacit dialect >> for programming verbs became, at some point, Turing complete. >> >> In addition, adverbial tacit programming is also complete in the sense that >> any explicit adverb can be rewritten tacitly. However, sometimes the tacit >> writing of very simple adverbs seems tedious to me, even with the use of >> black magic (that is, by blurring the orthodox distinction between verbs, >> adverbs and conjunctions), when compared to a lambda style syntax; it can >> be done easily but is an overkill akin of using J to compute 2 + 3 % 4. >> >> Thus, recently I decided to write my own tacit lambda adverb for a certain >> kind of J expressions using an unofficial extended version of the >> interpreter (not released yet). Lambda is an adverb that takes a variable >> number of arguments in strand notation (an n-tuple, so to speak, in >> Pascal's (extended) terminology). The following is a tease, suppose that >> we would like to produce the form <@:v u} ] >> >> >> JVERSION >> Installer: j602a_win.exe >> Engine: j701/2012-12-06/12:20/x >> Library: 6.02.023 >> >> It can be done sequentially, >> >> v0 [: v (<@:v u} ]) lambda NB. u is free, v is bound >> <@:v0 u} ] >> >> u0 [: u v0 [: v (<@:v u} ]) lambda lambda NB. both u and v are bound >> <@:v0 u0} ] >> 0 [: u < [: v (<@:v u} ]) lambda lambda NB. both u and v are bound >> <@:< 0} ] >> >> Or all at once, >> >> u0 v0 [: u v (<@:v u} ]) lambda >> <@:v0 u0} ] >> 0 ^ [: u v (<@:v u} ]) lambda >> <@:^ 0} ] >> >> h=. [: u v (<@:v u} ]) lambda NB. It does not have to be >> anonymous >> >> 0 ^ h >> <@:^ 0} ] >> >> u v h >> <@:v u} ] >> >> Counting [:, lambda in the expression ([: u v (<@:v u} ]) lambda) is a >> quadruple adverb that produces a double adverb (h) but lambda can take many >> arguments. >> >> Now, it is kick-off time! >> >> >> On Tue, Jan 27, 2015 at 1:24 PM, Tobia Conforto <[email protected]> >> wrote: >> >>> I, for one, found Raul's solution an interesting challenge to decode by >>> myself, purposely not looking at his explanation until I had cracked it >>> myself. >>> >>> Coming from a traditional and functional programming background, with some >>> recent APL study, I find explicit definitions much easier to understand >>> than J's verb trains. I still don't understand the philosophical reason why >>> J won't have a nice lambda syntax, analogous to {…} in modern APL or the >>> countless variations of (lambda …) or function() {…} in other languages. >>> >>> It would make it easier to nest function definitions, avoid unnecessary >>> string escaping, and introduce nested local (lexical) scoping, something >>> that seems conspicuously missing in J to my novice eyes. I'm sure there is >>> a reason, but I cannot see it yet. I get that { and } were too valuable as >>> standalone characters, but then I'm sure the authors could have found a >>> different pair of balanced symbols to use for this purpose, if they wanted. >>> >>> >>> On Tue, Jan 27, 2015 at 3:43 PM, Raul Miller <[email protected]> >>> wrote: >>> >>> > Are you asking for this? >>> > >>> > f=:13 :'y </.~ +/\ t * _1 |. t=. y ~: {.;:''&''' >>> > >>> > Thanks, >>> > >>> > -- >>> > Raul >>> > >>> > On Tue, Jan 27, 2015 at 4:22 AM, Linda Alvord <[email protected]> >>> > wrote: >>> > > >>> > > >>> > > Here's a challenge: >>> > > >>> > > >>> > > >>> > > Just because @ might show up in third grade, that doesn't include all >>> its >>> > > little cousins like @: & and &: >>> > > >>> > > >>> > > >>> > > To me, minimal documentation begins with the data using capital letters >>> > for >>> > > the name. Since F is not a verb, don't start here. >>> > > >>> > > >>> > > >>> > > F=: </.~ +/\@(-.@+._1&|.)@:=&(<,'&') >>> > > >>> > > >>> > > >>> > > Also it is a very tangled verb: >>> > > >>> > > 5!:4 <'F' >>> > > >>> > > -- ~ --- /. ---- < >>> > > │ -- \ --- / --- + >>> > > │ │ >>> > > │ │ -- -. >>> > > --+ -- @ -+ -- @ -+- +. >>> > > │ │ │ │ >>> > > │ -- @: --+ L-----+ -- _1 >>> > > │ │ │ L- & -+- |. >>> > > L- & -+ L- = >>> > > >>> > > >>> > > >>> > > Begin here with the data: >>> > > >>> > > L- <,'&' >>> > > >>> > > ]T=: ;:'4&count int 3 8&inrange' >>> > > >>> > > --T-T-----T---T---T-T-------┐ >>> > > │4│&│count│int│3 8│&│inrange│ >>> > > L-+-+-----+---+---+-+-------- >>> > > >>> > > >>> > > >>> > > Here's the challenge. Just for fun, write a single line direct >>> > definition of >>> > > F. Use simple J. You may use @ and name the verb f. >>> > > >>> > > >>> > > >>> > > >>> > > >>> > > f=: 13 :' (direcct defn) ' >>> > > >>> > > f T >>> > > >>> > > ------------T-----T---------------┐ >>> > > │--T-T-----┐│----┐│----T-T-------┐│ >>> > > ││4│&│count│││int│││3 8│&│inrange││ >>> > > │L-+-+------│L----│L---+-+--------│ >>> > > L-----------+-----+---------------- >>> > > >>> > > >>> > > >>> > > Apply f to T to get the result. >>> > > >>> > > >>> > > >>> > > That is usually enough information for sending a question to the forum. >>> > > Advanced programmers could use tacit verbs like Pascal's verb. Often >>> you >>> > can >>> > > only explain these parts in words. Having a sample of your data and an >>> > > indication of whether you are planning one or two arguments for your >>> verb >>> > > will help. >>> > > >>> > > >>> > > >>> > > Linda >>> > > >>> > > >>> > > >>> > > >>> > > >>> > > >>> > > >>> > > Message----- >>> > > From: [email protected] >>> > > [mailto:[email protected]] On Behalf Of Cliff >>> > Reiter >>> > > Sent: Monday, January 26, 2015 3:46 AM >>> > > To: [email protected] >>> > > Subject: Re: [Jprogramming] A parsing challenge >>> > > >>> > > >>> > > >>> > > Lovely. Tiny remark: >>> > > >>> > > >>> > > >>> > > <mailto:-.@> -.@+. could be replaced by +: >>> > > >>> > > >>> > > >>> > > On 1/26/2015 1:00 AM, Raul Miller wrote: >>> > > >>> > >> A note of explanation... >>> > > >>> > >> >>> > > >>> > >> (I have been noticing that far too much software is poorly documented. >>> > > >>> > >> And while I cannot do an adequate job of documenting other people's >>> > > >>> > >> software, I can document software I write.) >>> > > >>> > >> >>> > > >>> > >> F=: </.~ +/\@( <mailto:-.@+._1&|.)@:=&(%3c,'&')> >>> > > -.@+._1&|.)@:=&(<,'&') >>> > > >>> > >> T=: ;:'4&count int 3 8&inrange' >>> > > >>> > >> >>> > > >>> > >> The first thing I do is find out where & appears: >>> > > >>> > >> =&(<,'&') T >>> > > >>> > >> 0 1 0 0 0 1 0 >>> > > >>> > >> >>> > > >>> > >> The second thing I do is rotate to the right and combine: >>> > > >>> > >> (+. _1&|.) =&(<,'&') T >>> > > >>> > >> 0 1 1 0 0 1 1 >>> > > >>> > >> >>> > > >>> > >> Except I want to mark the beginning of each section with a 1, and >>> > > >>> > >> right now they are zeros. >>> > > >>> > >> ( <mailto:-.@> -.@+. _1&|.) =&(<,'&') T >>> > > >>> > >> 1 0 0 1 1 0 0 >>> > > >>> > >> >>> > > >>> > >> As an aside, note that I could have cut that step out if I had started >>> > > >>> > >> by identifying where & does not appear (and then combine using logical >>> > > >>> > >> and instead of logical or): >>> > > >>> > >> >>> > > >>> > >> (* _1&|.) ~:&(<,'&') T >>> > > >>> > >> 1 0 0 1 1 0 0 >>> > > >>> > >> >>> > > >>> > >> Next, I use plus scan to turn my markers into keys: >>> > > >>> > >> >>> > > >>> > >> +/\ (* _1&|.) ~:&(<,'&') T >>> > > >>> > >> 1 1 1 2 3 3 3 >>> > > >>> > >> >>> > > >>> > >> Finally, I use these keys to group the original elements: >>> > > >>> > >> >>> > > >>> > >> T </.~ +/\ (* _1&|.) ~:&(<,'&') T >>> > > >>> > >> +-----------+-----+---------------+ >>> > > >>> > >> |+-+-+-----+|+---+|+---+-+-------+| >>> > > >>> > >> ||4|&|count|||int|||3 8|&|inrange|| >>> > > >>> > >> |+-+-+-----+|+---+|+---+-+-------+| >>> > > >>> > >> +-----------+-----+---------------+ >>> > > >>> > >> >>> > > >>> > >> And that exposition pretty much follows the thought process I >>> > > >>> > >> originally used to compose the sentence. >>> > > >>> > >> >>> > > >>> > >> Thanks, >>> > > >>> > >> >>> > > >>> > > >>> > > >>> > > ---------------------------------------------------------------------- >>> > > >>> > > For information about J forums see < >>> http://www.jsoftware.com/forums.htm >>> > > >>> > > 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
