Non è del tutto chiaro cosa stai chiedendo qui. I concetti di "funzione" e "istruzione" sono reciprocamente incompatibili: una funzione è una subroutine che restituisce un valore, non ha effetti collaterali e è referenzialmente trasparente, mentre una istruzione non ha un valore e quindi deve necessariamente avere un effetto collaterale e quindi non può essere referenzialmente trasparente.
Quindi, una funzione può mai essere definita in termini di dichiarazioni, solo in termini di espressioni.
Quindi, sì, ci sono linguaggi in cui le funzioni non possono contenere istruzioni, vale a dire tutti i linguaggi di programmazione funzionale. Questi non hanno nemmeno hanno dichiarazioni.
Haskell è un buon esempio. (Nota: Haskell in effetti ha ha dichiarazioni, ma non al livello del calcolo effettivo.Ad esempio, l'importazione del modulo è un'istruzione o la definizione di un tipo.Tuttavia, questi sono costrutti di tempo di compilazione, non costrutti di esecuzione , quindi, l'idea di "restituire un valore" non ha nemmeno senso comunque.)
Nota, ci sono anche molte lingue che non sono linguaggi funzionali che tuttavia non hanno dichiarazioni, ad es. Ruby, Io, Ioke, Seph, Smalltalk, Self, Newspeak, Schema.
Oppure, stai parlando di programmazione combinando le funzioni? Poi, ancora, sì, questo esiste, ed è chiamato "programmazione funzionale". Nella programmazione funzionale, si costruiscono programmi usando le funzioni come principale (e solo!) Strumento di costruzione e strutturazione, combinandole e manipolandole. Esistono anche dei linguaggi in cui le funzioni sono le primitive solo fornite dal linguaggio. Ancora una volta, Haskell, è un esempio. Ha cose come valori letterali numerici (ad esempio 1
), ma puoi interpretarli come funzioni null.
Naturalmente, la manifestazione originale di questa idea è lambda calcolo.
Ci sono anche lingue in cui non anche hanno funzioni, solo solo hanno combinatori. Unlambda è un tale linguaggio, che come suggerisce il nome è uno dei pochissimi linguaggi di programmazione funzionale che non si basa sul calcolo lambda. Invece, si basa sul calcolo del combinatore SKI.
Il calcolo del combinatore SKI ha solo tre primitive: il combinatore S, il combinatore K e il combinatore I. (In realtà, si scopre che il combinatore I può essere espresso come SKK, quindi non è davvero primitivo, puoi cavartela solo con S e K.) Non ha alcun tipo di dati: nessun valore di booleana, nessun numero, no niente. (Proprio come il lambda calcolo). Tuttavia, a differenza del lambda calcolo, non ha, beh, lambda (cioè funzioni) né variabili. Eppure, è un modello di calcolo completo di Turing che in realtà precede anche sia le macchine di Turing che il Lambda Calculus.