esiste un linguaggio di programmazione progettato per esprimere combinazioni di dati? [chiuso]

1

Molto spesso, quando usi la riga di comando o semplicemente la programmazione, vuoi esprimere un qualche tipo di combinazione che finisci per usare un for - che è spesso dettagliato.

for (int i = 0; i<10; ++i)
    std::cout << "img_" << i << std::endl;

for f in *; do echo "$f"; done

Mi sono sempre chiesto se esiste un qualche tipo di linguaggio per semplificare questo caso? Ad esempio:

"mv img_[0~6] imgs"

tradurrebbe in

mv img_0 imgs
mv img_1 imgs
mv img_2 imgs
mv img_3 imgs
mv img_4 imgs
mv img_5 imgs

img_[0~1][0~1] potrebbe funzionare per img_00, img_01, img_10, img_11

img_[x:0~2][x] potrebbe funzionare per img_00, img_11, img_22

Ecc.

Non sto chiedendo questa sintassi particolare, solo se c'è qualche tipo di linguaggio / funzione mai implementato allo scopo di esprimere tali combinazioni nel modo più semplice possibile?

    
posta MaiaVictor 19.07.2013 - 21:31
fonte

2 risposte

7

In bash, puoi scrivere

mv img_{0..5} imgs/

che è espanso dalla shell in

mv img_0 img_1 img_2 img_3 img_4 img_5 imgs/

Puoi anche usare una classe di caratteri:

mv img_[0-5] imgs/

che funzionerebbe solo per quei file che già esistono e corrispondono all'espressione, mentre il primo si espande a tutte le possibilità anche se i file non esistono. I ricci possono anche riempire il numero espanso con zeri ( {001..030} ), invertire l'ordine ( {z..a} ) o generare combinazioni ( {a..z}{0..5} ).

    
risposta data 19.07.2013 - 22:00
fonte
4

Per rispondere alle tue preoccupazioni immediate, bash può eseguire alcune azioni basate sull'intervallo sui file esistenti.

$ ls
sample1.txt  sample2.txt  sample3.txt  sample4.txt  samples

$ mv sample[1-3].txt samples/

$ ls *
sample4.txt

samples:
sample1.txt  sample2.txt  sample3.txt

Ma qui c'è una tendenza più grande in gioco. La programmazione di array cerca di allontanarsi dai cicli espliciti. E 'stato davvero spinto da APL all'inizio ed è ora comune in molti linguaggi matematici come MATLAB o Mathematica. Ad esempio, posso aggiungere due array numerici con un semplice

c = a + b

Allo stesso modo, comprensione degli elenchi utilizza la notazione impostata per creare un array. Questa è una caratteristica comune in molte lingue oggi, inclusi Python e Haskell.

S = [2 * x for x in range(101) if x ** 2 > 3]

Nel regno dello scripting di shell, posso usare xargs per eseguire un comando su più input.

hg st | cut -d ' ' -f 2 | xargs rm     # delete my leftovers from Mercurial

Nel mondo dei database, SQL può eseguire query e aggiornamenti su un'intera colonna.

select sym from stocks where price < 20.0 order by sym;

Infine, la ricorsione elimina i loop definendo un'entità in termini di se stessa:

fac 0 = 1
fac x = x * fac (x-1)

Quindi ci sono molti esempi in cui le lingue sono passate da iterazioni esplicite a favore di strutture dichiarative.

    
risposta data 19.07.2013 - 21:46
fonte

Leggi altre domande sui tag