-
X-Received: by 2002:ac8:4509:: with SMTP id q9mr633675qtn.1.1546550485451; Thu, 03
Jan 2019 13:21:25 -0800 (PST)
X-Received: by 2002:ac8:4509:: with SMTP id q9mr633675qtn.1.1546550485451; Thu, 03
Jan 2019 13:21:25 -0800 (PST)
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit
0.net!weretis.net!feeder6.news.weretis.net!feeder.usenetexpress.com!feeder-in1.
iad1.usenetexpress.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!v55no10
2310qtk.0!news-out.google.com!h3ni13294qtk.1!nntp.google.com!v55no102299qtk.0!p
ostnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: pl.comp.programming
Date: Thu, 3 Jan 2019 13:21:25 -0800 (PST)
In-Reply-To: <4...@g...com>
Complaints-To: g...@g...com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=46.186.77.192;
posting-account=f7iIKQoAAAAkDKpUafc-4IXhmRAzdB5r
NNTP-Posting-Host: 46.186.77.192
References: <c...@g...com>
<f...@g...com>
<a...@g...com>
<7...@g...com>
<a...@g...com>
<6...@g...com>
<0...@g...com>
<a...@g...com>
<1...@g...com>
<e...@g...com>
<6...@g...com>
<1...@g...com>
<2...@g...com>
<5...@g...com>
<9...@g...com>
<q0lcv9$abq$1@gioia.aioe.org>
<1...@g...com>
<4...@g...com>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <1...@g...com>
Subject: Re: Jaki język polecić początkującemu? - komentarz do artykułu w
Programista 9/2018
From: g...@g...com
Injection-Date: Thu, 03 Jan 2019 21:21:25 +0000
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Lines: 179
Xref: news-archive.icm.edu.pl pl.comp.programming:213154
[ ukryj nagłówki ]W dniu czwartek, 3 stycznia 2019 21:51:47 UTC+1 użytkownik fir napisał:
> W dniu czwartek, 3 stycznia 2019 18:20:04 UTC+1 użytkownik g...@g...com
napisał:
> >
> > Przykład, który lubię dawać na różnych prezentacjach, to program
> > liczący sumę kwadratów początkowych siedmiu liczb pierwszych.
> >
> > Imperatywnie zapisalibyśmy go tak:
> >
> > 1: licznik := 7
> > 2: liczba := 0
> > 3: suma := 0
> > 4: dopóki (licznik > 0):
> > 5: jeżeli jest_pierwsza(liczba):
> > 6: suma := suma + liczba^2
> > 7: licznik := licznik - 1
> > 8: liczba := liczba + 1
> >
> > i jeszcze musieli dopowiedzieć, że po wykonaniu programu
> > wynik znajdziemy w zmiennej "suma".
> >
> > Natomiast przy podejściu funkcyjnym po prostu "formalizujemy"
> > sformułowaine problemu: "suma kwadratów początkowych 7 liczb pierwszych"
> > ma swoją strukturę gramatyczną, którą możemy uwypuklić, biorąc jednostki
> > znaczeniowe w nawiasy:
> >
> > (suma (kwadraty (początkowe 7 liczby-pierwsze)))
> >
> > Teraz wystarczy nam wyjaśnić, co to jest (suma elementów)
> > czym są (kwadraty elementów), co to jest (początkowe N elementy)
> > i czym są liczby-pierwsze.
> >
> > To jest kod, który bardzo łatwo się komponuje, i który
> > bardzo łatwo się czyta, testuje i analizuje (I nie trzeba wyjaśniać,
> > gdzie należy szukać wyniku)
> >
> > wiadomo, że (o ile definicje pojęć są takie, jakich byśm oczekiwali) wyrażenie
> >
> > (suma (kwadraty (początkowe 7 liczby-pierwsze)))
> >
> > jest równoważne wyrażeniu
> >
> > (suma (kwadraty '(2 3 5 7 11 13)))
> >
> > które jest równoważne wyrażeniu
> >
> > (suma '(4 9 25 49 121 169))
> >
> > i tak dalej.
> >
> lol ale mozesz podac ten kod w lispie w postaci takiej kompletnosci jak ten
przyklad w pseudkodzie, by to rzeczywiscie porownac?
>
> bo to jest raczej istotnie
>
>
> w c taki programik nie wyglada zbyt tragicznie
>
>
> int PoliczSumeParuPoczatkowychLiczbPierwszych(int ilu)
> {
>
> int dodano_pierwszych =0;
> int suma = 0;
>
> for(int i=0;;i++)
> {
> if(jest_liczba_pierwsza(i))
> {
> suma+=i*i;
> dodano_pierwszych++;
> if(dodano_pierwszych==ilu) return suma;
> }
> }
> }
>
> to ze nie wydziela on etapow na podej pierwsze, podnies do kwadratu zsumuj wynika
raczej z tego ze pisze sie to tak by dzialalo szybko.. jak ktos sie nie upiera by
bylo tak szybko moze podzielic na te fazy
>
>
> chetnie bym zobaczyl taki kompletny progamik w tym lispie scheme czy co to tam jest
Ogólnie derywację tego programu mam dość dogłębnie opisaną
w pierwszym rozdziale "Pamphletu":
https://github.com/panicz/pamphlet/raw/master/pamphl
et.pdf
W praktyce zapisałbym go raczej np. tak (jeżeli język
wspierałby leniwą ewaluację):
(sum (map square (initial 7 (only prime? numbers))))
gdzie "map", "only" i "initial" są zdefiniowane tak:
(define (map f list)
(if (null? list)
'()
;else
(cons (f (first list)) (map f (rest list)))))
(define (initial n elements)
(if (= n 0)
'()
;else
(cons (first elements) (initial (- n 1) (rest elements))))))
(define (only satisfying? elements)
(if (null? elements)
'()
;else
(if (satisfying? (first elements))
(cons (first elements) (only satisfying? (rest elements)))
;else
(only satisfying? (rest elements)))))
W Haskellu może jest nieco zwięźlej i czytelniej:
map f [] = []
map f (h:t) = (f h):(map f t)
initial 0 elements = []
initial n (first:rest) = first:(initial (n-1) rest)
only satisfying [] = []
only satisfying (first:rest) = if (satisfying first)
then first:(only satisfying rest)
else only satisfying rest
Teraz, w języku z leniwą ewaluacją możemy zbudować nieskończoną listę liczb:
(define (numbers-from n)
(cons n (numbers-from (+ n 1))))
(define numbers (numbers-from 0))
albo w Haskellu:
numbersFrom n = n:(numbersFrom (n+1))
numbers = numbersFrom 0
Sumę definiujemy następująco:
(define (sum list)
(if (null? list)
0
;else
(+ (first list) (sum (rest list)))))
albo w Haskellu:
sum [] = 0
sum (first:rest) = first + (sum rest)
W jezyku bez leniwej ewaluacji jest nieco ciężej (ten wariant jest
opisany w Pamphlecie)
Jeżeli idzie o "wydajność", to kompilator Haskella wspiera technikę
kompilacji zwaną "fuzją" albo "deforestacją", i efektywnie wynikowy
kod będzie z grubsza równoważny temu, co Ty napisałeś (nie będą
tworzone żadne dodatkowe struktury w pamięci, tylko będzie pętla
iterująca po jakichś tam zmiennych)
Następne wpisy z tego wątku
- 04.01.19 01:13 fir
- 04.01.19 02:00 AK
- 04.01.19 09:20 Maciej Sobczak
- 04.01.19 09:40 g...@g...com
- 04.01.19 10:25 AK
- 04.01.19 11:15 g...@g...com
- 04.01.19 12:50 AK
- 04.01.19 13:29 g...@g...com
- 04.01.19 13:34 fir
- 04.01.19 13:47 fir
- 04.01.19 13:52 g...@g...com
- 04.01.19 14:01 fir
- 04.01.19 14:12 g...@g...com
- 04.01.19 14:15 AK
- 04.01.19 14:16 fir
Najnowsze wątki z tej grupy
- Arch. Prog. Nieuprzywilejowanych w pełnej wer. na nowej s. WWW energokod.pl
- 7. Raport Totaliztyczny: Sprawa Qt Group wer. 424
- TCL - problem z escape ostatniego \ w nawiasach {}
- Nauka i Praca Programisty C++ w III Rzeczy (pospolitej)
- testy-wyd-sort - Podsumowanie
- Tworzenie Programów Nieuprzywilejowanych Opartych Na Wtyczkach
- Do czego nadaje się QDockWidget z bibl. Qt?
- Bibl. Qt jest sztucznie ograniczona - jest nieprzydatna do celów komercyjnych
- Co sciaga kretynow
- AEiC 2024 - Ada-Europe conference - Deadlines Approaching
- Jakie są dobre zasady programowania programów opartych na wtyczkach?
- sprawdzanie słów kluczowych dot. zła
- Re: W czym sie teraz pisze programy??
- Re: (PDF) Surgical Pathology of Non-neoplastic Gastrointestinal Diseases by Lizhi Zhang
- CfC 28th Ada-Europe Int. Conf. Reliable Software Technologies
Najnowsze wątki
- 2024-12-30 Moduł BT BLE 5.0
- 2024-12-30 Łódź => Application Security Engineer <=
- 2024-12-30 Lublin => Inżynier bezpieczeństwa aplikacji <=
- 2024-12-30 Nowy Outlander PHEV w PL
- 2024-12-30 Warszawa => Key Account Manager <=
- 2024-12-30 Katowice => Key Account Manager (ERP) <=
- 2024-12-28 Śmiechu KOOOOOOPA ;-)
- 2024-12-29 Pomiar amplitudy w zegarku mechanicznym
- 2024-12-28 Antyradar
- 2024-12-28 Deweloper przegral w sadzie musi zwrócic pieniądze Posypia sie kolejne pozwy?
- 2024-12-28 Warszawa => Full Stack .Net Engineer <=
- 2024-12-28 Warszawa => Sales Assistant <=
- 2024-12-28 Warszawa => Programista Full Stack .Net <=
- 2024-12-28 Warszawa => Full Stack web developer (obszar .Net Core, Angular6+) <=
- 2024-12-28 Katowice => Head of Virtualization Platform Management and Operating S