У науци о компјутерима for-петља (или једноставније for петља) је контролна изјава у програмским језицима за навођење итерације (понављања) , која омогућава коду да се извршава у више наврата. Синтакса for петље је направљена у стилу програмског језика у којем се користи или је позајмљена из старијих програмских језика, па тако програмски језици који су потомци или изданци истог језика ће често користити исту реч да означе итератор, нпр., потомци ALGOL-а користе „for“, док потомци Fortran-а користе „do“. Постоје и друге могућности, на пример COBOL користи „PERFORM“.

дијаграм протока for петље

За разлику од других петљи, као што је while петља, for петље често одликују израженији бројачи или израженије променљиве. Ово омогућава телу for петље (код који се у више наврата извршава) да зна редослед сваког понављања. For петље се углавном користе када се број понављања зна пре него што се петља напише. Када се while петља може написати као For петља и када се зна број понављања, боље је користити For петљу јер је краћа.

Име For петље потиче од енглеске речи for, која се користи као кључна реч у највећем броју програмских да би се увела for петља. Овај израз се користио још у ALGOL-у 58, а постао је популаран касније у ALGOL-у 60; он је директан превод немачке речи für, коришћене у Superplan-у (1949-1951) Хајнца Рутисхаусера, који је такође био укључен у програмирању ALGOL-а 58 и ALGOL-а 60. Тело петље извршава „for“ за вредности променљивих из петље, и ово је много израженије у ALGOL изјавама, у којима се листе потенцијалних вредности и/или корака могу одредити.

У FORTRAN и PL/I, се користи кључна реч DO, а петља се зове do петља, и пошто је скоро идентична for петљи описаној овде, нећемо је користити како је не би мешали са do while петљом.

Врсте for петљи

Изјаве For петљи су доступне у већини императивних програмских језика. Чак и игноришући мање разлике у синтаксама постоји много разлика у томе како ове изјаве раде и какав ниво изражајности подржавају. Генерално for петље се могу поделити на:

Традиционалне for петље

Традиционалне for петље у C / C++ састоје се из 3 дела: увођење, услов и накнадна мисао и сва 3 дела су опциона.[1][2]

for (УВОЂЕЊЕ; УСЛОВ; НАКНАДНА МИСАО) 
{
    // Код тела фор петље иде овде
}

У увођењу се наводе (вероватно и додељују) све потребне променљиве. Тип променљивих би требало да буде исти ако користите више променљивих у делу увођења. Услов проверава услов, и прекида петљу ако услов даје логички одговор нетачно. Накнадна мисао се извршава само једном сваки пут када се петља завршава и понавља.

Ево примера традиционалне for петље у Јави.

for (int i = 0; i < 100; i++) // Штампа бројеве од 0 до 99 (не и 100), сваки одвојен размаком.
{
    System.out.print(i);
    System.out.print(' ');
}
System.out.println();

For петље засноване на понављању

Овај тип for петље је копија for петље засноване на нумеричким опсезима; јер омогућава бројање скупова ставки који не морају бити низови бројева. Обично се одликује употребом имплицитног или експлицитног итератора, у којој променљива петље преузима вредност из секвенци или из друге могуће колекције. Репрезентативан пример у Пајтону је:

for stavka in objekat:
    uradi nešto
    uradi nešto drugo

Где је објекат или колекција која подржава имплицитно понављање (као листа имена запослених) или је то можда сам итератор. Неки језици имају ово као додатак другим синтаксама for петље; посебно PHP има овај тип петље под именом for each, као и троизразну for петљу (видети доле) под именом for.

Векторизоване for петље

Неки језици нуде for петље које обављају if процес на свим понављањима паралелно, за разлику од експлицитне форме понављања. На пример то ради кључна реч for all у FORTRAN 95, који има тумачење да су сви изрази са десне стране вредновани пре него што су задаци направљени. У for изјавама у следећим деловима псеудокода, где рачунајући нову вредност за A(i), осим за прву (за i = 2), позивање на A(i - 1) ће добити нову вредност која ће бити постављена на исто место као у претходном кораку. У for all верзији, сваки рачун односи се само на оригиналан, неизмењени A.

for     i := 2 : N - 1 do A(i) := [A(i - 1) + A(i) + A(i + 1)] / 3; next i;
for all i := 2 : N - 1 do A(i) := [A(i - 1) + A(i) + A(i + 1)] / 3;

Разлика може бити значајна.

Неки језици (као FORTRAN 95, PL/I) такође нуде низ изјава за додељивање, које омогућују да многе for петље буду изостављене. Тако ће псеудокод A := 0; поставити све елементе низа А на нулу, без обзира на њену величину или димензију. На пример таква петља може бити:

 A(2 : N - 1) := [A(1 : N - 2) + A(2 : N - 1) + A(3 : N)] / 3;

Да ли је изражена у стилу for петље, for all петље или неке друге можда неће бити тачно описано у упутству.

Спојене for петље

Уведене у ALGOL 68 и испраћене са PL/I, омогућавају да понављање петље буде спојено са испитивањем, као у

for i := 1 : N while A(i) > 0 uradi itd.

То јест, вредност је додељена променљивој i и само ако је израз тачан тело петље ће се извршити. Ако је вредност нетачна израчунавање се завршава. Под претпоставком да је вредност променљиве дефинисана након завршетка петље, горња наредба ће пронаћи први не позитиван елемент низа А (ако такав не постоји, негова вредност ће бити N+1) или, са одговарајућим варијантама, први не празан карактер у ниској, итд.

Додатне семантике и конструкције

Коришћење бесконачне петље

Овај С-стил for петљи је још од основних корака понављања је потпуно у контроли програмера. У ствари, када су бесконачне петље намерно створене, ова врста for петљи се може користити (са празним изразима) као:

for (;;)
   //тело петље

Овај стил се користи уместо бесконачне while (1) петље да би се избегло упозорење у неким С/С++ компајлерима.[3] Неки програмери воле више језгровиту for (;;) форму него семантички еквивалентну али опширнију while (тачно) форму.

Рани излаз и наставак

Неки језици такође могу да пруже и друге пратеће изјаве, које када су присутне могу да мењају понављање for петље. Заједничке међу њима су break и continue изјаве које се налазе у C програмском језику и његовим изданцима. Изјава break прекида петљу одмах након задатог услова. Изјава continue ће одмах кренути на следећу итерацију без даљег напретка кроз тело петље за текућу итерацију. Остали језици могу имати сличне изјаве или да на други начин обезбеде средства за мењање for петље ; на пример у FORTRAN-у 95:

DO I = 1, N
  изјаве                   !Извршава све вредности за "I", све до катастрофе ако постоји.
  IF (није добро) CYCLE    !Прескаче ову вредност за "I", наставља са следећом.
  изјаве                   !Извршава само где је добро.
  IF (катастрофа) EXIT     !Напушта петљу.
  изјаве                   !Све док је добро, док није катастрофа.

END DO !Треба да се усклади са "DO".

Обим променљиве у петљи и семантика

Различити језици наводе различита правила за оно што ће вредност променљиве у петљи имати након завршетка петље. Ово дозвољава преводиоцу да генерише код који не оставља никакву вредност променљивој из петље, или можда чак и оставља, али је то непромењена вредност петље и никада се не чува у меморији. Стварно понашање може чак да варира у складу са поставкама оптимизације компајлера, као са Honywell Fortran66 компајлером.

У неким језицима (али не у С и C++) петља променљиве је непроменљива у оквиру тела петље, сваки покушај да се промени њена вредност сматра се семантичком грешком. Такве модификације су понекад последица грешке програмера, што може бити веома тешко идентификовати. Међутим сама грешка ће вероватно бити откривена од стране људи који проверавају код. Ситуације у којима адресе променљивих у петљи пролазе као аргументи потпрограма су веома тешко проверљиве, јер понашање рутине је у целини непознато у компајлеру. Неки примери у Фортрановом стилу:

DO I = 1, N
  I = 7                           !Очито подешавање променљиве из петље. Вероватно приговор.
  Z = ADJUST(I)                   !Функција "ADJUST" ће изменити "I", у неизвесно.
  нормалне изјаве                 !Меморија ће избрисати да је "I" променљива из петље.
  PRINT (A(I), B(I), I = 1, N, 2) !Користи петљу да одштампа непарне елементе низа А и В, поново користећи "I"…
  PRINT I                         !Која вредност ће бити одштампана?
END DO !Колико пута ће петља бити рачуната?

Заједнички приступ је да израчуна тачку понављања на почетку петље (са посебним освртом на изливање као у for i := 0 : 65535 do ... ; у шеснаестобитном интиџеру аритметике) и са сваким новим издањем смањи ово, рачунајући while такође додавањем вредности I: дупло бројање резултата. Такође прилагођавање вредности I: дупло бројати резултате. Међутим, прилагођавања вредности I у оквиру петље неће променити број понављања извршења.

Још једна могућност је да је код генерисан и може се користити помоћну променљиве као променљива петље, вероватно сачуваном у регистру, чија вредност може или не може бити копирана у I на сваком понављању. Опет, модификације I неће утицати на контролу петље, али сада је на раскрсници могуће: у оквиру петље, референце вредности I могу бити (евентуално измењене) садашње вредности I или помоћне променљиве I па су збуњујући резултати загарантовани. На пример, у оквиру петље референцу на елемент I низа вероватно ће запослити помоћну променљиве (поготово ако је одржана у регистру), али ако је параметар на неку рутину (на пример, штампање изјава открива своју вредност), вероватно би позивало на одговарајуће променљиве I. Најбоље је да се избегну такве могућности.

Прилагођавање граница

Баш као што индекс променљиве може бити модификован у оквиру for петљи, тако се могу мењати и границе и правци. Али са неизвесним ефектима. Преводилац може спречити такве покушаје, јер они можда немају никакав ефекат, или чак можда након тога неће радити исправно, мада би многи рекли да је погрешно то урадити. Размотрите изјаву као for i := first : last : step do

  A(i) := A(i) / A(last);

Ако приступ састављању такве петље треба да буде процена првог, последњег члана, броја корака и обрачун понављања са нечим као (последњи-први)/корак само на почетку, и онда ако те ставке буду једноставне променљиве и њихове вредности су некако увећане током понављања, то неће имати никаквог ефекта на итерацију count иако је елемент изабран за поделу са А (последњи) промењен.

Листа вредности опсега

PL/I и ALGOL 68 омогућава петљама у којима се налази променљива да се понављају изван опсега вредности уместо у једном опсегу. Следи PL/I пример који израчунава петљу са 6 вредности за i:1,7,12,13,14,15:

do i = 1, 7, 12 to 15;
  /*изјаве*/
end;

Еквивалентност са while петљом

For петља се може конвертовати у еквивалентну while петљу дописивањем бројача променљиве директно. Следећи псеудокод показује ову технику:

faktorijel = 1
 for broj from 1 to 5
     faktorijel = faktorijel * broj

Лако се преводи у while петљу:

faktorijel = 1
 broj = 1
 while broj <= 5
    faktorijel = faktorijel * broj
    broj = broj + 1

Овај превод је мало компликован за језике који дозвољавају скакање до новог понављања у петљи (као continue изјава у С-у). Ове изјаве ће обично имплицитно повећавати број петље, али не и еквивалент while петље (јер у овом другом случају број није саставни део конструкције петље). Било који превод ће морати да стави све изјаве унутар блока који експлицитно повећава број пре покретања изјаве.

Хронологија синтаксе for петље у разним програмским језицима

На основу акције која мора бити поновљена, на пример, пет пута, различити језици ће for петљу написати другачије. Синтакса за три израза for петље је скоро идентична у свим језицима који га имају, након различитих стилова блока-крај петље и тако даље.

1957: FORTRAN

Док користите кључну реч do уместо for, овај тип FORTRAN-ове do петље се понаша слично као троаргументна for петља у осталим језицима. Овај пример се понаша исто као остали, иницијализујући број променљиве на 1, увећавајући је за 1 у свакој итерацији петље и стопирати када достигне вредност 5.

do broj = 1, 5, 1
  write(*, '(i2)') broj
end do

У FORTRANfor петља је еквивалентна са DO петљом. Синтакса Fortran-ове DO петље је:

         DO ознака број=почетак, крај, корак
         изјаве
  ознака изјава

Где се део корака може изоставити уколико је корак један. Пример: (простори су ирелевантни у Fortran изјавама, тако SUM SQ је исто као SUMSQ)

! Пример DO петље
       PROGRAM MAIN
         SUM SQ = 0
         DO 101 I = 1, 9999999
           IF (SUM SQ.GT.1000) GO TO 109
           SUM SQ = SUM SQ + I**2
101 CONTINUE
109 CONTINUE
       END

1958: Algol

Алгол је први пут формализован у извештају Algol58.

1960: COBOL

COBOL је формализован крајем 1959 год. И имао је много елаборација. Користи PERFORM реч која има много опција, уз касније додавање „саставних“ изјава као што су END-PERFORM. Игнорисањем потребе за декларисањем и иницијализацијом променљиве, еквивалентно са for петљом ће бити:

      PERFORM VARYING I FROM 1 BY 1 UNTIL I > 1000
             ADD I**2 TO SUM-SQ.
      END-PERFORM

Ако реч PERFORM има опциони додатак TEST AFTER, добијена петља је нешто другачија: тело петље извршава се најмање једном, пре било каквог теста.

1964: BASIC

Петље у BASIC понекад се називају for next петље.

For I = 1 to 5;
 Print I;
Next I

Обратите пажњу да маркер краја петље наводи име индекса променљиве, која мора да одговара имену индекса променљиве на почетку for петље. Неки језици (PL/I, FORTRAN 95 и касније) омогућавају ознаку изјаве на почетку for петље тако да може бити ухваћена од стране компајлера у односу на исти текст на одговарајућој изјави end. Фортран такође омогућава EXIT и CYCLE изјаве да би означили име овог текста; у гнезду петље ово чисти петљу која је намењена. Међутим, на овим језицима етикете морају да буду јединствене, тако узастопне петље које укључују исти индекс променљиве не могу да користе исти текст, нити може етикета бити иста као име променљиве, као што је индекс променљиве у for петљи.

1964: PL/I

do broj = 1 to 5 by 1; /* "by 1" је подразумевано ако ништа није наведено */
  /*изјаве*/;
  end;

Изјава LEAVE може да се користи за излазак из петље. Петља може бити означена, и leave ће можда оставити посебну петљу у групи гнезда петљи. Неки PL/I дијалекти укључују изјаву ITERATE да прекине тренутну итерацију петље и да почне следећа.

1968: Algol 68

Алгол68 има оно што је сматрано универзалном петљом, пуна синтакса је:

FOR i FROM 1 BY 2 TO 3 WHILE i≠4 DO ~ OD

Даље, један опсег понављања може бити замењен листом таквих опсега. Постоји неколико необичних аспеката конструкције.

  • само "do ~ od" део је обавезан, у овом случају петља ће се понављати унедоглед.
  • тако ће се део "to 100 do ~ od" поновити тачно 100 пута.
  • елемент "while" ће дозволити програмеру да прекине for петљу раније, као у:
INT sum sq := 0;
FOR i
 WHILE
  print(("Do sada:", i, new line)); # Уведено за сврху праћења. #
  sum sq ≠ 70↑2                    # Ово је тест за WHILE   #
DO
  sum sq +:= i↑2
OD

1970:Pascal

for Broj := 1 to 5 do
  (*изјава*);

Опадање (рачунајући уназад) користи „downto“ кључну реч уместо „to“, као у:

for Broj := 5 downto 1 do
  (*изјава*);

Нумерички опсег for петље варира нешто више.

1972: C/C++

for (иницијализација; услов; увећање/смањење)
    изјава

Изјава је обично блок изјава; пример овога је:

//Коришћење for петљи за додавање бројева 1 - 5
int sum = 0;
for (int i = 1; i < 6; ++i) {
    sum += i;
}

1972: Smalltalk

1 to: 5 do: [ :broj | "изјаве" ]

За разлику од других језика, у Smalltalk-у for петља није језичка конструкција, али је дефинисана у класи Број као метод са два параметра, на крају вредности и затварања, користећи себе као почетну вредност.

1980: Ada

for Broj in 1 .. 5 loop
   -- изјаве
end loop;

Изјава exit може да се користи за излазак из петље. Петље могу бити означене, а излаз може оставити посебно означену петљу у групу угнежђених петљи:

Racun:
    for Broj in 1 .. 5 loop
   Trougao:
       for Secondary_Index in 2 .. Broj loop
          -- изјаве
          exit Račun;
          -- изјаве
       end loop Trougao;
    end loop Račun;

1980: Maple

Maple има два облика for петљи, један за понављање опсега вредности, а други за понављања садржаја контејнера. Вредност опсега је следећи:

for i from f by b to t while w do
    # тело петље
od;

Сви делови осим do и od су опциони. "For i" део, ако је присутан, мора бити први. Преостали део ("from f", "by b", "to t", "while w") може да се појави у било ком редоследу.

Итеративно преко посуде врши се користећи овај облик петље:

for e in c while w do
    # тело петље
od;

"In c" део прецизира контејнер, који може бити листа, скуп, збир, производ, функција, низ, или објекат спровођење итератор.

For петља може се раскинути са od, end, или end do.

1982: Maxima CAS

У Maxima CAS-у могу се користити и не целобројне вредности:

for x:0.5 step 0.1 thru 0.9 do
    /* "Ради нешто са x" */

1982: PostScript

For петља, написана као [почетна] [прираст] [лимит] {...}for започиње са унутрашњом променљивом, и извршава тело док унутрашња променљива није виша од лимита (или не мања, ако је негативан прираштај ) и, на крају сваке итерације, повећава унутрашњу променљиву. Пре сваког понављања, вредност унутрашње променљиве је пребачена у стек.[4]

1 1 6 {ИЗЈАВЕ} for

Ту је такође и проста repeat петља. Repeat петља, написана са Х { ... } repeat понавља тело тачно Х пута.[5]

5 { ИЗЈАВЕ } repeat

1983: Ada 83 и изнад

procedure Main is
  Sum_Sq : Integer := 0;
begin
  for I in 1 .. 9999999 loop 
    if Sum_Sq <= 1000 then
      Sum_Sq := Sum_Sq + I**2
    end if;
  end loop;
end;

1984: MATLAB

for i = 1:5 
     -- изјаве
end

1987: Perl

for ($broj = 1; $broj <= 5; $broj++) { # садашње или претходно дефинисане променљиве
  # изјаве;
}
for (my $broj = 1; $broj <= 5; $broj++) { # променљиве из петље
  # изјаве;
}
for (1..5) { # променљиве имплицитно назване $_; 1..5 стварају листе од 5 елемената
  # изјаве;
}
изјава for 1..5; # готово иста (само 1 изјава) са природним низом
for my $broj (1..5) { # променљиве из петље
  # изјаве;
}

1988: Mathematica

Конструкција for петље која одговара већини других језика у Mathematica се назива Do.

Do[f[x], {x, 0, 1, 0.1}]

Mathematica такође има For конструкцију који имитира for петљу С језика.

For[x= 0 , x <= 1, x += 0.1,
    f[x]
]

1989: Bash

# прва форма
for i in 1 2 3 4 5
do
    # мора имати најмање једну команду у петљи
    echo $i  # само штампа вредност i
done
# друга форма
for (( i = 1; i <= 5; i++ ))
do
    # мора имати најмање једну команду у петљи
    echo $i  # само штампа вредност i
done

Имајте на уму да се празна петља (тј једна без команди између do и done)третира као синтаксна грешка. Ако изнад петље садржи само коментаре, извршење ће резултирати поруком "синтаксна грешка код неочекиваног знака 'Done'".

1990: Haskell

Уграђени императив forM_ мапира израз у листу, као

forM_ [1..5] $ \indx -> do изјаве

или да сваким новим издањем резултат буде као у листи

statements_result_list <- forM [1..5] $ \indx -> do изјаве

Али, ако желите да сачувате простор [1..5] у листи, више аутентична forLoop_ конструкција може се дефинисати као

import Control.Monad as M

forLoopM_ :: Monad m => a -> (a -> Bool) -> (a -> a) -> (a -> m ()) -> m ()
forLoopM_ indx prop incr f = do
        f indx
        M.when (prop next) $ forLoopM_ next prop incr f
  where      
    next = incr indx

И користити се као:

  forLoopM_ (0::Int) (< len) (+1) $ \indx -> do -- било шта са индексом

1991: Oberon-2, Oberon-07, or Component Pascal

FOR Broj := 1 TO 5 DO
  (* изјава *)
END

Имајте на уму да је у оригиналном језику Oberon for петља изостављена у корист генералног конструкта Oberon петље. For петљa је поново уведена у Oberon 2.

1991: Python

for broj in range(1, 6): # опсег (1, 6) даје вредност од 1 до 5 (али не 6)
  # изјаве

1993: AppleScript

repeat with i from 1 to 5
	-- изјаве
	log i
end repeat

Такође можете проћи кроз листу ставки, слично ономе што можете да урадите са низовима y другим језицима:

set x to {1, "вафли", "сланина", 5.1, false}
repeat with i in x
	log i
end repeat

Такође можете користити "exit repeat" да изађете из петље у било ком тренутку. За разлику од других језика, AppleScript тренутно нема никакву наредбу да настави до следеће наредбе у петљи.

1993: Lua

for i = почетак, крај, интервал do
     -- изјаве
end

Дакле, овај код

for i = 1, 5, 2 do
     print(i)
end

ће исписати:

1 3 5

For петље могу такође да иду кроз табелу коришћењем

ipairs()

да бројчано понови кроз низове и

pairs()

да насумице прелазили преко речника.

Генерисана for петља прави затварања:

for ime, telefon, adresa in kontakti() do
     -- kontakti() морају бити понављајућа функција
end

1995: CFML

Скрипт синтакса

Једноставан индекс петље:

for (i = 1; i <= 5; i++) {
	// изјаве
}

Користећи низ:

for (i in [1,2,3,4,5]) {
	// изјаве
}

Коришћењем "листе" вредности ниски:

loop index="i" list="1;2,3;4,5" delimiters=",;" {
	// изјаве
}

Таг синтакса

Једноставан индекс петље:

<cfloop index="i" from="1" to="5">
	<!--- изјаве --->
</cfloop>

Користећи низ:

<cfloop index="i" array="#[1,2,3,4,5]#">
	<!--- изјаве --->
</cfloop>

Коришћењем "листе" вредности ниски:

<cfloop index="i" list="1;2,3;4,5" delimiters=",;">
	<!--- изјаве --->
</cfloop>

1995:Java

for (int i = 0; i < 5; i++) {
    //обавља функције у оквиру петље;
    //може користити изјаву 'break;' да брзо изађе из петље
    //може користити изјаву 'continue;' да прескочи тренутни корак 
}

За продужену for петљу, погледајте Foreach петљу

1995:JavaScript

JavaScript подржава С стил "троизразних" петљи. Вreak и continue изјаве су подржане у петљи.

for (var i = 0; i < 5; i++) {
    // ...
}

Алтернативно, могуће је поновити преко свих кључева једног низа.

for (var key in array) { // такође ради са assoc. arrays
  // користи array[key]
  ...
}

1995: PHP

for ($i = 0; $i <= 5; $i++)
{
  for ($j = 0; $j <= $i; $j++)
  {
    echo "*";
  }
  echo "<br />";
}

1995: Ruby

for broj in 1..5
  # изјаве
end

5.times do |broj| # број се понавља од 0 до 4
  # изјаве
end

1.upto(5) do |broj|
  # изјаве
end

1996: OCaml

Погледајте синтаксу израза.[6]

 (* for_изјава := "for" ident '='  expr  ( "to" ∣  "downto" ) expr "do" expr "done" *)

for i = 1 to 5 do
    (* изјаве *)
  done ;;

for j = 5 downto 0 do
    (* изјаве *)
  done ;;

1998: ActionScript 3

for (var broj:uint = 1; broj <= 5; broj++){
  //изјава;
}

Имплементација у Интерпретираним програмским језицима

У интерпретираним програмским језицима, for петље могу бити реализоване на више начина. Често су for петље директно преведене на асемблер као упоређујућа упутства и упутства условних скокова. Међутим, то није увек тако. У неким тумачима програмских језика, for петље су само преведене на while петље.[7] На пример, узмите следећи Mint/Horchata код:

for i = 0; i < 100; i++
    print i
end

за сваку ставку секвенце
    штампај ставку
крај

/* 'Преведена традиционална for петља' */
i = 0
while i < 100
    print i
    i++
end

/* 'Преведена for each петља' */
SYSTEM_VAR_0000 = 0
while SYSTEM_VAR_0000 < sekvenca.length()
    stavka = sekvenca[SYSTEM_VAR_0000]
    print stavka
    SYSTEM_VAR_0000++
end

Види још

Референце

Литература

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.