🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #247161

Re: ile czasu trzeba aby sie nauczyc c++?

#247161
From: godek.maciek
Date: Fri, 21 Apr 2017 22:36
77 lines
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-mail
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>

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