Article View: pl.comp.lang.c
Article #247161Re: ile czasu trzeba aby sie nauczyc c++?
From: godek.maciek
Date: Fri, 21 Apr 2017 22:36
Date: Fri, 21 Apr 2017 22:36
77 lines
4969 bytes
4969 bytes
W dniu piątek, 21 kwietnia 2017 23:51:30 UTC+2 użytkownik (fir) napisał:
> ten przyklad wyglada dosyc ladnie, ale ciagle lispa powiedzialbym jak patrze na kod rozumiem powiedzialbym 'polowicznie' (co nie jest dziwne bo sie go nie uczylem)
>
> a przetlumaczenie na asma takiego czegos
>
> x = (3*a+(c-2)/d+f)*g
>
> (gdzie to co jest litera monza uznac za rejestr, tylko jednoliterowe nazwy rejestrow, a to co jest digitem mozna uznac za inta)
>
> duzo by w lispie zajelo?, w c to mi zajelo o ile mgliscie pamietam dobrych kilkaset linijek (co prawda zle to napisalem) - jesli by ten lisp naprawde robil to sprawniej niz c to mozna uznac za pewna wartosc
Tzn. oczywiście zależy jak do tego podejść.
Jeżeli chcielibyśmy przeparsować stringa "(3*a+(c-2)/d+f)*g", to pewnie
byłoby z tym nieco zabawy (najwygodniej pewnie byłoby to oprzeć
o wyrażenia regularne).
Gdybyśmy założyli, że mamy listę tokenów daną w postaci
lispowej, a dodatkowo wyrażenia w nawiasach są już złożone
do pojedynczego wyrażenia, tzn, że mamy w Lispie takie coś
'((3 * a + (c - 2) / d + f) * g)
[tzn. separatory tokenów w lispie to spacje oraz nawiasy,
ale zupełnie nie ma znaczenia, czy symbole są jednoliterowe albo
liczby jednocyfrowe] to trzeba by to sobie było najpierw
zinterpretować, uwzględniając priorytety operatorów.
zakładając łączność lewostronną, tzn. że interpretujemy a + b + c
jako ((a + b) + c), oraz normalne priorytety, tzn. że / wiąże
najsilniej, po nim *, a + najsłabiej, można by to tak napisać:
(define (associate-left expression operator)
(match expression
((left op right)
(if (eq? op operator)
`((,left ,op ,right))
expression))
((left op right . more)
(if (eq? op operator)
(associate-left `((,left ,op ,right) . ,more) operator)
`(,left ,op . ,(associate-left `(,right . ,more) operator))))))
(e.g. (associate-left '(a * b + c * d) '+) ===> (a * (b + c) * d))
(e.g. (associate-left '(a * b + c * d) '*) ===> ((a * b) + (c * d)))
(define (infix->prefix expression)
(match expression
((left op right)
`(,op ,(infix->prefix left) ,(infix->prefix right)))
((left op right . more)
(infix->prefix (fold-left associate-left
expression
'(/ * - +))))
((expression) ;; usuwamy nadmiarowe nawiasy
(infix->prefix expression))
(_
expression)))
(e.g. (infix->prefix '((3 * a + (c - 2) / d + f) * g))
===> (* (+ (+ (* 3 a) (/ (- c 2) d)) f) g))
ale jak mówię, generalnie dla lispiarzy zagadnienia parsowania
są umiarkowanie interesujące, i lepiej sobie zaprojektować format
pliku tak, żeby dało się go przeparsować zwykłym lispowym
readem (który od razu zwraca drzewo, tzn. pozagnieżdżaną listę)
może kogoś to mierzić, że 1-1 to nie jest działanie arytmetyczne,
tylko symbol, ale mnie takie coś daje większą swobodę ekspresji
(ale też trzeba uważać, bo np. Scheme ma w standardzie liczby
zespolone, i zapis 1+1i oznacza liczbę, a nie symbol. No ale to
takie drobne niuanse)
Technical Details
Message-ID:
<3c2f8fa5-6258-4186-8284-b3ba17b8a586@googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.glorb.com!e132no1077809ite.0!news-out.google.com!v196ni359ita.0!nntp.google.com!c26no257040itd.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mailReferences:
<451e90e7$0$17965$f69f905@mamut2.aster.pl> <b1e91861-9e4f-4b2e-be9f-b9a47ca8d719@googlegroups.com> <58e14e55$0$5152$65785112@news.neostrada.pl> <50630553-5585-4c79-b204-10decc20648f@googlegroups.com> <93ccf1ff-6c50-4308-ba33-d7e593ffaeb0@googlegroups.com> <almarsoft.2018019733568017445@news.v.pl> <16c707cc-51c1-49fe-8d99-28670469a954@googlegroups.com> <780c3784-e9ed-44e6-b983-ba04d778a9c4@googlegroups.com> <6eb4f9c1-4016-43fc-8003-1484e904aa9b@googlegroups.com> <5af86780-9446-45cd-8776-b83b3f14296e@googlegroups.com> <64803b60-0828-4ab8-b089-d136c85e7b97@googlegroups.com> <0dd3c685-151a-4cea-b4c5-33131f9af96a@googlegroups.com> <d91506d3-d2e3-4d02-b1a0-99e3e334093c@googlegroups.com>Show Full Headers
Complete Article Headers
X-Received: by 10.157.25.45 with SMTP id j45mr4230641ota.38.1492814182880; Fri, 21 Apr 2017 15:36:22 -0700 (PDT) X-Received: by 10.157.89.201 with SMTP id u9mr335387otg.15.1492814182838; Fri, 21 Apr 2017 15:36:22 -0700 (PDT) Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.glorb.com!e132no1077809ite.0!news-out.google.com!v196ni359ita.0!nntp.google.com!c26no257040itd.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail Newsgroups: pl.comp.lang.c Date: Fri, 21 Apr 2017 15:36:22 -0700 (PDT) In-Reply-To: <d91506d3-d2e3-4d02-b1a0-99e3e334093c@googlegroups.com> Complaints-To: groups-abuse@google.com Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=46.186.72.252; posting-account=f7iIKQoAAAAkDKpUafc-4IXhmRAzdB5r NNTP-Posting-Host: 46.186.72.252 References: <451e90e7$0$17965$f69f905@mamut2.aster.pl> <b1e91861-9e4f-4b2e-be9f-b9a47ca8d719@googlegroups.com> <58e14e55$0$5152$65785112@news.neostrada.pl> <50630553-5585-4c79-b204-10decc20648f@googlegroups.com> <93ccf1ff-6c50-4308-ba33-d7e593ffaeb0@googlegroups.com> <almarsoft.2018019733568017445@news.v.pl> <16c707cc-51c1-49fe-8d99-28670469a954@googlegroups.com> <780c3784-e9ed-44e6-b983-ba04d778a9c4@googlegroups.com> <6eb4f9c1-4016-43fc-8003-1484e904aa9b@googlegroups.com> <5af86780-9446-45cd-8776-b83b3f14296e@googlegroups.com> <64803b60-0828-4ab8-b089-d136c85e7b97@googlegroups.com> <0dd3c685-151a-4cea-b4c5-33131f9af96a@googlegroups.com> <d91506d3-d2e3-4d02-b1a0-99e3e334093c@googlegroups.com> User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: <3c2f8fa5-6258-4186-8284-b3ba17b8a586@googlegroups.com> Subject: Re: ile czasu trzeba aby sie nauczyc c++? From: godek.maciek@gmail.com Injection-Date: Fri, 21 Apr 2017 22:36:22 +0000 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit