> [Aside: if I remember right, you wrote the tacit version there at rosetta code?]
That is right. > After sleeping on this thread for a few days, I've finally realized > that I don't have any idea what you mean by "ad hoc encodings". > > If you have time for some questions: What does "ad hoc encodings" > mean? Is that a good thing or a bad thing? Why? As far as I can see, when the argument of Y, the higher-order function, for which the product of Y is a fixed-point, is represented by means of standard code associated with recursions in J then one can produce relatively simple versions of Y which are, as much as possible (given the lack of direct support of higher-order functions as arguments by the current official interpreters), in compliance with the specifications of the Rosetta Code (RC) task. (Beware of line-wrapping) As an illustration, this is a comparison between the slightly revised version of my non-tacit version of the Y combinator for monadic recursions, X=. 1 :'<(<,'':''),<(<1;~":0),<(":0);,(''u u`:6('',(5!:5<''u''),'')`:6 y'')'(1 :'u u`:6') renamed as X to be able to distinguish it from the explicit version of Y in the RC entry, Explicit alternate implementation https://rosettacode.org/wiki/Y_combinator#Explicit_alternate_implementation (which I suppose you wrote). Using recursive computations of factorials as an example, M=. 1 :'1:`(* u@:<:)@.*' M=. (5!:1)<'M' Due to J`s aforementioned limitation, it is unavoidable the use of a representation of the adverb (i.e., the higher-order function), the AR of the adverb (M) is chosen as the argument for X, M X ("0) i.11 1 1 2 6 24 120 720 5040 40320 362880 3628800 This argument is closely related to usual ways to define recursive verbs, ( $:M`:6) ("0) i.11 1 1 2 6 24 120 720 5040 40320 362880 3628800 (f=. f M`:6) ("0) i.11 1 1 2 6 24 120 720 5040 40320 362880 3628800 or, more generaly, (f=. 3 :'f M`:6 y')("0) i.11 1 1 2 6 24 120 720 5040 40320 362880 3628800 M=. 1 :'if. * y do. y * u <: y else. 1 end.' M=. (5!:1)<'M' (f=. 3 :'f M`:6 y')("0) i.11 1 1 2 6 24 120 720 5040 40320 362880 3628800 In contrast, Y (as per the explicit RC J entry) is a noun (and a gerund) and by itself does not produce anything, wrap=. _66 [\ (5!:5)@:< wrap'Y' ,<(<,':'),<(<(,'0');3),<(,'0');3 21$'g=.y recur= . sivelY`:6 g recur`:6 recur ' Not surprisingly, the argument for Y Ev (Ev is a name referring to `:6) is also a noun (and a gerund) and by itself does not produce anything either, wrap'almost_factorial' ,<(<(<,':'),<(<(,'0');2),<(,'0');5 26$' if. (_1 {:: m) <: #m do. v |. y;_1 }. m else. (y;m) Defer v`'''' end. '),<(<(<,'0'),<,<2),<(<,':' ),<(<(,'0');3),<(,'0');3 25$'''f n''=.y if. 0 >: n do. 1 else. n * f`:6 n-1 end.' and, it seems, its particular purpose is to be used as an argument for (Y Ev). On the one hand, regarding the recursive verbs produced by each of the combinators, v=. (Y Ev almost_factorial)Ev is a verb, wrap'v' ((<,<(<(<,':'),<(<(,'0');2),<(,'0');5 26$' if. (_1 {:: m) <: #m d o. v |. y;_1 }. m else. (y;m) De fer v`'''' end. '),<(<(<,'0'),<(<,<(<(<, ':'),<(<(,'0');2),<(,'0');5 26$' if. (_1 {:: m) <: #m do. v |. y;_1 }. m else. (y;m) Defer v`'''' end. '),<(<(<,'0'),<,<2),<(<,':'),<(<(, '0');3),<(,'0');3 25$'''f n''=.y if. 0 >: n do. 1 else. n * f`:6 n-1 end.'),<2),<(<,':'),<(<(,'0');3),<(,' 0');2 29$'''g recur''=.y (recursivelY`:6 g)`:6 r ecur'),(<,<(<(<,':'),<(<(,'0');2),<(,'0');5 26$' if. (_1 {:: m) < : #m do. v |. y;_1 }. m else. (y ;m) Defer v`'''' end. '),<(<(<,'0'),<,<2 ),<(<,':'),<(<(,'0');3),<(,'0');3 25$'''f n''=.y if. 0 >: n do. 1 else. n * f`:6 n-1 end.'),<3) (2 : 0) (3 : 0) 'g recur x'=.y (g`:6 recur`:6 recur)`:6 x ) if. (_1 {:: m) <: #m do. v |. y;_1 }. m else. (y;m) Defer v`'' end. ) and this linear representation of (Y Ev almost_factorial)Ev is incomplete; in other words, the verb produced is not stateless and consequently it is vulnerable to reassignments, (Y Ev almost_fibonacci)Ev ("0) i. 11 0 1 1 2 3 5 8 13 21 34 55 Defer=. 1 (Y Ev almost_fibonacci)Ev ("0) i. 11 |syntax error | (y;m)Defer v`'' Thus, the explicit entry in RC is not an implementation of the Y combinator complying with the specifications. On the other hand, the verb produced by M X is stateless and relatively very simple, u=. M X wrap'u' <(<,':'),<(<(,'0');1),<<;._1 '|0|u u`:6(<(<,'':''),<(<(,''0'');1), <(,''0'');,:''if. * y do. y * u <: y else. 1 end.'')`:6 y' (1 : 'u u`:6(<(<,'':''),<(<(,''0'');1),<(,''0'');,:''if. * y do. y * u <: y else. 1 end.'')`:6 y') Furthermore, according to the interpreter (Y Ev almost_factorial)Ev seems to be doing a lot of unnecessary stuff vs M X for the task at hand, stp=. ] (([ ((<;._1 '|Sentence|Space|Time|Space * Time') , (, */&.:>@:(1 2&{))@:(] ; 7!:2@:] ; 6!:2)&>) (10{a.) -.&a:@:(<;._2@,~) ]) [ (0 0 $ 13!:8^:((0 e. ])`(12"_)))@:(2 -:/\ ])@:(".&.>)@:((10{a.) -.&a:@:(<;._2@,~) ]) ::(0 0&$@(1!:2&2)@:('Mismatch!'"_))) ".@:('0( : 0)'"_) stp 11 (Y Ev almost_factorial)Ev("0) i.11 M X ("0) i.11 ) ┌──────────────────────────────────┬───────┬──────────┬────────────┐ │Sentence │Space │Time │Space * Time│ ├──────────────────────────────────┼───────┼──────────┼────────────┤ │(Y Ev almost_factorial)Ev("0) i.11│1242368│0.0142416 │17693.3 │ ├──────────────────────────────────┼───────┼──────────┼────────────┤ │M X ("0) i.11│250304 │0.00179289│448.768 │ └──────────────────────────────────┴───────┴──────────┴────────────┘ I hope it helps On Mon, Nov 19, 2018 at 7:11 PM Jose Mario Quintana < jose.mario.quint...@gmail.com> wrote: > I am on vacation this week. I will have more time (and access to a PC) > when I get back. > > On Monday, November 19, 2018, Raul Miller <rauldmil...@gmail.com> wrote: > >> [Aside: if I remember right, you wrote the tacit version there at rosetta >> code?] >> >> After sleeping on this thread for a few days, I've finally realized >> that I don't have any idea what you mean by "ad hoc encodings". >> >> If you have time for some questions: What does "ad hoc encodings" >> mean? Is that a good thing or a bad thing? Why? >> >> Thanks, >> >> -- >> Raul >> >> >> ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm