Sto provando a utilizzare Shake e mi sono imbattuto nel seguente problema: non esiste un modo facile e conveniente per interpolare una stringa. Conosco Text.Printf
- non è quello che sto cercando. La sintassi di interpolazione di cui sto parlando è così:
(Fai)
HEADERS_DIR := /some/path/to/dir
CFLAGS := "-g -I$(HEADERS_DIR) -O2"
(Python)
headers_dir = "/some/path/to/dir"
cflags = "-g -I{headers_dir} -O2".format(**locals())
E ora confronta questo con la possibile soluzione di Haskell. In primo luogo:
$ cabal install interpolatedstring-perl6
$ ghci -XExtendedDefaultRules -XQuasiQuotes
E poi:
> import Text.InterpolatedString.Perl6 (qq)
> let headers_dir = "/path/to/some/dir"
> [qq| -g -I$headers_dir -O2 |] :: String
Mentre penso che Make vada forse un passo troppo lontano nella sua impazienza di interpolare anche quando non è stato chiesto, mi chiedo perché Haskell non abbia una funzione format
come fa Python. Potrebbe analizzare la stringa fornita e tirare il valore con lo stesso nome di riferimento nel modello:
let headers_dir = "/path/to/some/dir"
format "-g -I$headers_dir -O2"
C'è una ragione specifica per cui non è implementata, oppure tutti sono contenti della verbosità di Text.Printf
e / o della lunga configurazione delle librerie di interpolazione?
Aggiornamento : molte persone interpretano erroneamente la domanda come una domanda sulla formattazione generale delle stringhe, con possibilità di specifiche di precisione in caso di numeri interi, ecc. Gli esempi forniti dimostrano un caso specifico di interpolazione, che è solo "sostituisci il risultato di show a
nel luogo del nome". Permette una sintassi più semplice, e non usa una funzione variadica di per sé.