( rpsoft | 2020. 12. 30., sze – 10:59 )

Nem kritizáltam a szubrutinhívást, csak a terminológiát; amit te szubrutinhívásnak nevezel az a BASIC gosubja, de pl. a Fortran call-ja nem ilyen. Az, amit te csinálsz, emulálható, a goto-val

      ...
      x=12.07
      assign 1 to k
      goto 1200
1     continue
...
...
c program vége
      goto 1000
c HK-típ. szubrutinok
...
c példa szubrutin, kiír
1200  write (*,"(F14.5)") x
      goto k
c szubrutin vége
...
1000  continue
      end

A BASIC gosub-jához hasonlóan nincsenek a szubrutinnak argumentumai, hanem a főprogram (vagy beágyazó Fortran szubrutin, függvény) változóit használja. A különbség csak annyi, hogy az assign-nal bele kell tenni egy változóba a labelt, ahova vissza menjen (a BASIC gosub-ja ezt megcsinálja neked automatikusan). A C-ben szabvány szerint nincs ilyen goto, de kiterjesztésként implementálható egy compilerben (pl. gcc-ben le lehet kérni egy label címét az && operátorral, és a goto-nak lehet egy címet (void* pointert) adni, ahova ugorjon.

Hogy miért nincs a Fortranban többszinten embedded function? Nem tudom, de még soha nem volt rá szükségem.

A lambda pedig nem olyan bonyolult dolog, csak az elnevezés vacak (történeti okai vannak), egyszerűen még egy fajta függvény. Amikor létrehozod:

auto myLambda = [](double x){return cos(x)*cosh(x);};

csak annyit mondasz, hogy legyen myLambda egy olyan függvény, ami azt csinálja, ami a {...} között van. A [] csak egy jelölés (ez volt még szabad), de lehet közé írni, pl. ha hozzá kell férni a főprogram változóihoz, de nem kell módosítani őket, akkor

auto myLambda2 = [k](double x){ return cos(k*x); }; // k a főprogramban van

ha módosítani akarod, akkor meg

auto myLambda3 = [&k](double x){ auto rv = cos(k*x); k=0.9*k; return rv;} // k a főprogramban van

a []-be azt is írhatod, hogy =, akkor a főprogram minden változóját megkapod másolatban (nem megy vissza a változás), vagy hogy &, akkor mindet módosíthatod is (referenciát kapsz). Csinálhatsz generic lambdákat is (ha meg kellene írnod pl. ugyanazt a cuccot double-re is és complex<double>-re, de csak egyszer akarod).