x=:0 is bad form, so I am going to ignore that part. In fact, I'd eliminate all internal =: from that definition and start with:
pmt=: 3 : 0 0 pmt y : 'r t b'=. y D=.(1 + r % 1200) ^ t b*(r % 1200) * D % D - 1 ) And our paranoia test is: pmt 5.75 240 12500 87.7604 The next issue is that we're working with more than two values, that makes it a bit complicated. On the other hand, we never use x - if it's provide we ignore it. So I'm going to ignore it here. If that bothers you, use pmt=: pmt&] f. after we've got the tacit expression. (Using f. on the final expression will also protect from some damage if you happen to run the original with it's D=: expression...). Anyways... To simplify this slightly, notice that we never want to use the value of r. Instead, we always want r%1200. So we can divide y by 1200 1 1 and work the remainder of the dyadic expression becomes: pmt1200=: 3 : 0 'r t b'=. y D=.(1 + r) ^ t b*r * D % D - 1 ) A tacit expression to compute D directly from this y would be: D=: [: (^~ >:)/ (2 3$0 1 0 1 0 0) +/ .* ] with that definition of D, pmt1200 can be pmt1200 =: (%<:)@D * 1 0 1 */ .# ] and our tacit pmt becomes pmt=: pmt1200@(%&1200 1 1) Trying it out: pmt 5.75 240 12500 87.7604 Good enough? -- Raul On Sun, Sep 9, 2018 at 9:55 PM Linda Alvord <lindaalvor...@outlook.com> wrote: > > Here's a classic. Can anyone write this in tacit? > > NB. Mortgage is Rate Months Loan > > pmt=: 3 : 0 > (x =: 0) pmt y > : > 'r t b'=:y > D=:(1 + r % 1200) ^ t > b*(r % 1200) * D % D - 1 > ) > > pmt 5.75 240 12500 > > In 1961 I bought a house for $17,000. With a loan of $12,000 at 5.75 interest > for 20 years. As a tenured teacher and a woman no bank would give me a > mortgage but for 20 years I payed the previous woman owner $87.77. At the > last payment it just so happened that I sold it. > > Linda > > -----Original Message----- > From: Programming <programming-boun...@forums.jsoftware.com> On Behalf Of > 'Mike Day' via Programming > Sent: Saturday, September 8, 2018 1:45 PM > To: programm...@jsoftware.com > Subject: Re: [Jprogramming] Tacit form: How to handle intermediate > > Agreed on the "strong hint" in herona below. I got into that habit > > years ago in Fortran.... > > And Sorry for the unintentional extra characters. (I'm seeing > > A-circumflex where I'd typed space!) Just as well we're not talking APL! > > Mike > > > On 08/09/2018 09:40, Martin Kreuzer wrote: > > @Linda > > > > I think that your > > heron=: 13 :'%:*/(s y),(s y)-y' > > looks superior to my initial approach as it gathers _all four_ factors > > under the (*/) Times Insert. > > > > btw "Hope you have good classes!" > > > > For quite some time, I don't have classes any more, but once in a > > while do private tutoring; my last two students finished their > > 'matura' at Easter this year (and one of them is on 'work & travel' in > > New Zealand presently). > > > > @Mike > > > > Looking at your 'minor change' and the resulting tacit code, methinks > > that (sy=. s - y) is giving the interpreter a much stronger hint that > > there's a re-used intemediate result than the construct (' ... [ s2=. > > .... ') I used initially. > > > > -M > > > > At 2018-09-07 09:43, you wrote: > > > >> Fair enough, it looks neat, but doesn't deal with Martin > >> Kreuzer's original requirement to apply s just the once, ie how > >> should we handle the intermediate result, s? > >> > >> On the other hand, David Lambert and others propose variations on how > >> to factor the formula so as to use the result of s. > >> > >> It's usually easy in explicit form, harder in tacit form. It > >> seems to me that using 13 : ... is very helpful in developing a tacit > >> form, but it often fails to spot opportunities to save intermediate > >> results. 13 : ... isn't an optimising compiler - or is it? It > >> certainly doesn't spot the opportunity to save the repeated (s y) in > >> Linda's example. > >> > >> Somewhat to my surprise, a minor change to Linda's explicit > >> expression does result in a single applicaton of s in a quite elegant > >> tacit form: > >> > >>    herona=: 13 :'%:*/sy,(sy=.s y)-y' > >> > >>    herona 3 4 5 > >> > >> > >> > >>    herona 5 12 13 > >> > >> 30 > >> > >>    herona > >> > >> [: %: [: */ s ([ , -) ] > >> > >> > >> Cheers, > >> > >> Mike > >> > >> On 07/09/2018 08:19, Linda Alvord wrote: > >>> It keeps getting simpler: > >> > >>> s=: 13 :'-:+/y' > >>> heron=: 13 :'%:*/(s y),(s y)-y' > >>> heron 3 4 5 > >>> heron 4 5 6 > >>> d > >> > >> > >>> ;:'[: -: +/' > >> > >>> heron > >> > >>> ;:'[: %: [: */ s , s - ]' > >>> > >> > >>> Explisit sentences are like English and the new language is the > >>> computers J anguage. First learn the words and then learn to read > >>> ghe ords in sentences. And just as you might when learning Spanish, > >>> you might in time begin to speak it. > >> > >>> Linda > >> > >> > >>> -----Original Message----- > >>> From: Programming <programming-boun...@forums.jsoftware.com> On > >>> Behalf Of David Lambert > >>> Sent: Thursday, September 6, 2018 6:11 PM > >>> To: programming <programm...@jsoftware.com> > >>> Subject: Re: [Jprogramming] Tacit form: How to handle intermediate > >> > >>> A hook can save recomputation. > >> > >>> (computation with original data and reused me) (resuse me) > >> > >> > >>>   test=: [: %: ([: -: +/) * [: */ ([: -: +/) - ] > >> > >>>   NB. play with the half factor > >>>   f=:   4 %~ [: %: [: */ (([ , (- +:))~ +/) > >> > >>>   NB. shorter > >> > >>>   NB.   c o m p u t a t i o n   r e u s e > >>>   g=:   ([: %: [: */ [ , -)~    ([: -: +/) > >> > >>>   g2=:  ([: %: [: */ [ , -)~ -:@:(+/) > >> > >> > >>>   %/ (g , test) 3?@:$0 > >>> 1 > >> > >> > >>> On 09/04/2018 08:00 AM, programming-requ...@forums.jsoftware.com wrote: > >>>> Date: Tue, 04 Sep 2018 11:50:43 +0000 > >>>> From: Martin Kreuzer<i...@airkreuzer.com> > >>>> To:programm...@jsoftware.com > >>>> Subject: [Jprogramming] Tacit form: How to handle intermediate > >>>> result..? > >>>> Message-ID: > >>>> <5b8e71a5.1c69fb81.65e5c.4a9esmtpin_added_miss...@mx.google.com> > >>>> Content-Type: text/plain; charset="us-ascii"; format=flowed > >>>> > >>>> Hi all - > >>>> > >>>> To calculate the area of a flat triangle, using Heron's formula, > >>>> A(a,b,c)= sqrt( s2*(s2-a)*(s2-b)*(s2-c) ) I wrote a simple function > >>>> doing this: > >>>> > >>>> * get the three sides (as list input y) > >>>> * compute the half perimeter s2 > >>>> * build the differences s2-y > >>>> * build product > >>>> * take square root > >>>> > >>>> My explicit solution looks like this > >>>> > >>>> taher=: 13 : '%: s2 * */ s2-y [ s2=. -: +/ y' > >>>> > >>>> and works > >>>> > >>>> taher 3 4 5 > >>>> 6 > >>>> > >>>> Suggested tacit version looks like this (and works too) > >>>> > >>>> tahert=: [: %: ([: -: +/) * [: */ ([: -: +/) - ] > >>>> > >>>> Q: Is there a way to reference the intermediate result of ([: -: > >>>> +/) the half perimeter s2 within the tacit expression, as has been > >>>> done in the explicit..? > >>>> [Guess the interpreter takes care of this anyway; my question aims > >>>> at whether a shorter formulation could be reached.] > >>>> > >>>> Thanks > >>>> -M > >>> -------------------------------------------------------------------- > >>> -- > >>> For information about J forums see > >>> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww > >>> .jsoftware.com%2Fforums.htm&data=02%7C01%7C%7C8d2147240443485c7f > >>> 8c08d61445ac18%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C63671868 > >>> 6798916834&sdata=Yuys8QE3yMvBtUraCohR9dRgPugZDeNaNh3BoBCzJjU%3D& > >>> amp;reserved=0 > >>> -------------------------------------------------------------------- > >>> -- For information about J forums see > >>> https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww > >>> .jsoftware.com%2Fforums.htm&data=02%7C01%7C%7Cfbcf68689bed4e31e2 > >>> 8108d615b2cfcc%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C63672025 > >>> 5064176871&sdata=0sleKYElksLSP%2BOT8BYYtyzcuL3GTBuL14taSrgJQS8%3 > >>> D&reserved=0 > >> > >> > >> > >> --- > >> This email has been checked for viruses by Avast antivirus software. > >> https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww > >> .avast.com%2Fantivirus&data=02%7C01%7C%7Cfbcf68689bed4e31e28108d6 > >> 15b2cfcc%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C636720255064176 > >> 871&sdata=kMQGWHLjMejRbJOuSn5EvWU4j39TqVPCX73QNKV6k7g%3D&rese > >> rved=0 > >> --------------------------------------------------------------------- > >> - For information about J forums see > >> https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww. > >> jsoftware.com%2Fforums.htm&data=02%7C01%7C%7Cfbcf68689bed4e31e281 > >> 08d615b2cfcc%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C63672025506 > >> 4176871&sdata=0sleKYElksLSP%2BOT8BYYtyzcuL3GTBuL14taSrgJQS8%3D&am > >> p;reserved=0 > > > > ---------------------------------------------------------------------- > > For information about J forums see > > https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.j > > software.com%2Fforums.htm&data=02%7C01%7C%7Cfbcf68689bed4e31e28108 > > d615b2cfcc%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C63672025506417 > > 6871&sdata=0sleKYElksLSP%2BOT8BYYtyzcuL3GTBuL14taSrgJQS8%3D&re > > served=0 > > ---------------------------------------------------------------------- > For information about J forums see > https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.jsoftware.com%2Fforums.htm&data=02%7C01%7C%7Cfbcf68689bed4e31e28108d615b2cfcc%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C636720255064176871&sdata=0sleKYElksLSP%2BOT8BYYtyzcuL3GTBuL14taSrgJQS8%3D&reserved=0 > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm