Je connais un peu FORTH donc je vais me limiter à ça. C'est un langage de bas niveau, vous donnant en tant que programmeur un accès à toutes les ressources matérielles. Vous pouvez donc faire ce que vous voulez.
Accès simultané
Pour avoir des programmes parallèles (edit: utilisé pour dire de vrais programmes concurrents), vous avez besoin d'au moins deux unités d'exécution (CPU-s). Il serait plutôt trivial d'implémenter un mot dans FORTH disant, par exemple, "exécutez ce mot sur le processeur 2 en utilisant ces deux arguments". Le mot allouerait les deux piles nécessaires sur le processeur 2 et commencerait à exécuter le mot. Vous auriez besoin de vous limiter quelque peu exactement dans les constructions que vous pouvez utiliser dans ce programme.
Si le nombre de programmes simultanés est supérieur au nombre d'unités d'exécution, vous opterez pour des programmes "pseudo parallèles". Fondamentalement, il existe deux façons de procéder: les coroutines ou le multitâche préemptif. Dans tous les cas, il est possible (pas facile, mais bien décrit dans la littérature) comment y parvenir et FORTH vous permet d'accéder à toutes les choses de bas niveau dont vous avez besoin.
Évaluation paresseuse
Bien sûr, vous pouvez le faire dans FORTH comme dans n'importe quel langage de programmation. Ce ne sera pas aussi élégant ou "intégré" que dans Haskell. J'utiliserai un exemple très naïf.
L'idée est que vous définissez une "fonction" (utilisée librement ici) qui renvoie un ensemble de choses. Un exemple serait une fonction qui renvoie tous les entiers. Vous effectuez ensuite des opérations sur cet ensemble et lorsque vous avez terminé, donnez le résultat. Par exemple, vous souhaiterez peut-être additionner tous les entiers jusqu'à ce que la somme soit supérieure à 1000. Une évaluation non paresseuse attribuerait d'abord tous les entiers en tant qu'ensemble, ce qui est impossible car il existe un nombre infini d'entiers. Il commencerait alors à travailler sur cet ensemble. Une implémentation paresseuse aurait un moyen de "me donner la valeur suivante dans l'ensemble". Faire cela n'a vraiment besoin que d'une variable dans la fonction "last value give".
Haskell fait les choses de cette façon. Bien sûr, il gère des situations plus compliquées, mais l'idée est la même. Il recouvre l'évaluation d'une manière qui vous permet en tant que programmeur de vous concentrer sur le problème, pas sur la façon de le résoudre.