46 votes

Que peut-Lisp faire Lua peut pas?

Lua est plus un concurrent direct dans le script de l'arène est Python. Donc, souvent, il obtient en comparaison avec Python, mais j'ai entendu de nombreuses fois que Lua est très bien comme Lisp(Schéma) en termes de puissance expressive et la flexibilité.

Maintenant, je suis un Lua power-user, d'en connaître les subtilités, mais je l'ai seulement essayé Lisp une ou deux fois, alors, évidemment, je ne suis pas un expert, donc je me demandais quel genre de fonctions Lisp ont que Lua est manquant, le cas échéant?

Edit: Quelques résultats:

La lecture de Greg Hewgill suggéré par l'article et de l'article de Wikipédia j'ai trouvé les points suivants:

Certains points communs:

-Dans le Code Lisp vous avez Lambda, même avec Lua

-En Lisp Code et les Données sont les mêmes, même avec Lua (Voir l'exemple de code ci-dessous).

-Dans les fonctions Lisp ne sont pas spéciaux, même avec Lua.

-En Lisp, Tout est stocké dans un arbre de la mode, même avec Lua (pas aussi évident, mais son cas)

-En Lisp vous avez des S-expressions, en Lua l'ensemble de l'environnement est un tableau, et les tables ont le pouvoir de S-expressions, donc c'est probablement la même, pas sûr.

-Les deux Langues ont une véritable queue-l'appel de la sémantique

-Lisp a seulement des Atomes et des Listes, Lua a uniquement des Variables et des Tableaux, le résultat final, et la puissance est la même (je pense)

Lisp peut le faire, mais nécessitent des techniques de pointe, ou ne peut pas être fait en Lua

-En Lisp, vous pouvez faire les opérateurs de quoi que ce soit, c'est un peu possible avec Lua, mais il faut metatables, et donc les opérateurs peut être rien pour certains des fermetures et des objets, mais pas à l'échelle mondiale.

-En Lisp vous avez des Macros, En Lua vous n'avez pas, mais vous avez metatables. Je ne peux pas penser à un truc que vous pourriez faire avec les Macros qui ne peut être fait avec Lua régulier de la syntaxe, mais de son point de. (Voir MetaLua ci-dessous pour un exemple de la vraie Macro extension et la façon dont cela peut être fait en Lua)

-Lisp a préfixe de notation (+ 1 2 3 4), Lua ne dispose pas de cette

-en Lisp, vous pouvez combiner les paramètres de la Fonction "obligatoire, facultatif, mot-clé, et le reste des paramètres", dans Lua il n'y a pas de distinction entre les paramètres, de sorte que vous devez vérifier à la main

Lua peut le faire, et je n'ai aucune idée si Lisp peut le faire

-En Lua, vous pouvez échanger les fermetures et les environnements (global) et à l'exécution, peut Lisp faire cela?

-En Lua, vous pouvez échanger les metatables (similaire à C++ tables virtuelles, mais plus puissant) sur les objets et de les modifier à tout moment, lors de la compilation ou de l'exécution, peut Lisp faire cela?

-En Lua, vous avez entièrement fonctionnel fermetures, ne Lisp ont?

-En Lua tables peuvent devenir des foncteurs, peut Lisps listes de le faire? (Je pense que les S-expressions permettre cela, mais pas sûr)


Lisp-comme les Macros a également été mis en œuvre en Lua en tant que tel avec MetaLua de la bibliothèque:

----------------------------------------------------
-- Lambda-Calculus evaluator (weak head normal form)
----------------------------------------------------              
-{ extension "match" }

function replace(var, newval, term)
   match term with
   | `Var{ v } if v==var -> return newval
   | `Var{ _ } -> return term
   | `Apply{ f, x } -> 
      return `Apply{ replace(var, newval, f), replace(var, newval, x) }
   | `Lambda{ v, _ } if v==var -> return term
   | `Lambda{ v, b } ->
      return Lambda{ v, replace(var, newval, b) }
   end
end

function reduce_whnf(term)
   match term with
   | `Apply{ `Lambda { param, body }, arg } ->
      local x = replace (param, arg, body)
      return reduce_whnf(x)
   | _ -> return term
   end
 end


Il y a les sceptiques qui pensaient que Lua est en fait le code et les données, donc je vais tirer un exemple et une citation de la notice:

Ce ci-dessous de Code ou de Données en fonction de comment vous le regardez, parce que l'entrée est peut-être rien, il peut facilement traiter les données ci-dessous, mais que les données soufflet pourrait aussi être quelque chose de plus semblable à un code. De toute façon je n'ai pas vu d'exemple de Lisp faire quelque chose de code-données liées que Lua ne peut pas faire aussi facilement. Si un exemple de Lisp est disponible, je vais essayer de le faire correspondre avec Lua, si je ne suis pas tout à fait tort.

entry{
  title = "Tecgraf",
  org = "Computer Graphics Technology Group, PUC-Rio",
  url = "http://www.tecgraf.puc-rio.br/",
  contact = "Waldemar Celes",
  description = [[
    TeCGraf is the result of a partnership between PUC-Rio,
    the Pontifical Catholic University of Rio de Janeiro,
    and <A HREF="http://www.petrobras.com.br/">PETROBRAS</A>,
    the Brazilian Oil Company.
    TeCGraf is Lua's birthplace,
    and the language has been used there since 1993.
    Currently, more than thirty programmers in TeCGraf use
    Lua regularly; they have written more than two hundred
    thousand lines of code, distributed among dozens of
    final products.]]
  }

Et de citer le livre, il est dit:

La chose intéressante à propos de cette représentation est qu'un fichier avec une séquence d'entrées est un programme Lua


Aussi, voici un wikibook dans lequel l'auteur reproduit les exemples de code (en Lua) en vedette dans Paul Graham "Lisp". Comme preuve que Lua peut rien faire Lisp peut de la fonctionnelle de la programmation de la zone. (Avertissement, rappelez-vous que je ne suis pas un Lisper donc je ne peux pas en arrière cette déclaration personnellement)


Ici est une SORTE de lien vers quelques autres choses cool Lua peut le faire, que je ne sais pas si Lisp peut

32voto

Schéma (un dialecte de LISP) a la première classe de suites, même si Lua a continuations je ne pense pas qu'ils sont de première classe. Si vous voulez de la première classe de la continuation ou non c'est une autre question.

Aussi la déclaration que les environnements que des tables est aussi puissant que les s-expressions est tout à fait inutile. Beaucoup de choses sont tout aussi puissant, qui n'est pas de les rendre exploitables. Le fait est que les S-expressions et le lisp version du "code de données" permet d'écrire des programmes qui écrivent des programmes (macros dans ce cas) très facile. Vous pouvez le faire dans d'autres langues (le tout aussi puissant) mais il n'est pas aussi naturel, simple ou élégant.

Aussi loin que je n'ai vu aucune autre langue a aussi utilisable 'code de données, la fonction de cette s-donner les expressions lisp. Ce que vous voulez n'est pas le fait que le code pourrait être stockées en tant que données, c'est le fait que vous fonctionner sur le code avec la même facilité qu'un sur les données, et les S-expressions est la clé pour que. Si vous avez la notation infixe, vous devez analyser et agir sur les AST qui n'est pas naturel.

Je pense que votre question met en lumière une des différences les plus importantes: "-En Lua tables peuvent devenir des foncteurs, peut Lisps listes de le faire? (Je pense que les S-expressions permettre cela, mais pas sûr)". En lisp, il n'est pas vraiment un devenir (eh bien, vous pouvez compiler, mais c'est une autre affaire). S-expressions, et de les évaluer.

Aussi lisp est traditionnellement un langage compilé, et la compilation (souvent) plus rapide.

MAIS rien de tout cela importe vraiment beaucoup. Alors que lisp est (encore) mon idéal de langue, de ce que j'ai vu de lua, celle que vous choisissez pour un projet particulier ne dépend pas de la langue de la puissance, mais d'autres circonstances.

14voto

Adam Smith Points 2167

J'ai fait une bonne quantité de programmation en Lua et ont essayé de jouer avec le schéma de temps en temps. Pour le moment, je ne vois pas comment vous pouvez traiter de code de données en Lua alors qu'il est tout à fait évident pour moi que vous pouvez faire cela dans le schéma.

Je ne pense pas que votre

  entry{
   title = "Tecgraf",
   org = "Computer Graphics Technology Group, PUC-Rio",
   url = "http://www.tecgraf.puc-rio.br/"
  }

exemple montre les données lua peut traiter le code de données, sauf si j'ai raté quelque chose.

En lua, c'est un tas de code appelé dans l'ordre:

a()
b()
c()

Comment puis-je manipuler cette liste de code? Dans le schéma de cette séquence de code serait

((a) (b) (c))

Qui est un régime régulier de la liste. Et le Système de liste peut être manipulé. Je peux prendre cette liste de code comme argument à une fonction et à déplacer le code. Comment pouvez-vous faire de même en Lua? Vous ne pouvez pas prendre un morceau de code Lua et de réorganiser les états.

Code Lua n'est pas exprimé en tant que table de hachage entrées, donc je ne vois pas ce que lua table de hachage comme aussi souple que le Régime.

Le problème avec Lua et dans toute autre langue qui tente d'imiter la puissance de LISP est essentiellement qu'ils essayez de venir avec une agréable et plus lisible par l'homme de la syntaxe. Mais la puissance de LISP vient de son horrible syntaxe. Vous ne pouvez pas recréer ce pouvoir sans avoir et tout aussi horrible syntaxe LISP. Par horrible, je ne veux pas dire perl sorte de façon. Dans que c'est tout un gâchis. LISP syntaxe est extrêmement régulier et simple. Qu'est ce qui le rend à la fois puissant et difficile à lire pour les humains.

Sur le côté positif, cette horrible syntaxe permet d'ajouter des macros à la langue, sans l'ajout de presque n'importe quelle complexité. Ce qui rend la syntaxe des macros en LISP plus facile que n'importe où ailleurs. Langue avec une syntaxe plus lisible, comme le C++. qui ont ajouté les macros ont fini avec un très compliquée macro-syntaxe.

6voto

Greg Hewgill Points 356191

Un très bon article sur ce sujet est La Nature de Lisp. Le point clé sur Lisp et ses dialectes, c'est que le code et les données ont exactement la même représentation comme une structure de données. Par conséquent, vous pouvez écrire du code qui crée le plus de code (comme Lisp macros). Aussi, vous pouvez écrire du code pour lire le code comme une structure de données et les manipuler.

Je sais à peu près autant à propos de Lua comme vous le faites sur Lisp, mais de ce que j'ai lu sur Lua ce genre de flexible de macro fonctionnalité n'est pas disponible.

6voto

Matthias Benkard Points 11264

Je ne sais rien à propos de Lua de la métaprogrammation installations, mais la comparaison capacité brute n'est pas d'une grande utilité lorsque l'on compare les langages de programmation. Ce qui fait Lisp macros spécial n'est pas le fait qu'ils existent. C'est plus d'une fonctionnalité de compilateur qu'une fonctionnalité du langage, de toute façon. En principe, vous pouvez ajouter un système de macro pour la plupart des langues. La chose importante à propos de Lisp macros, c'est que (1) ils sont incroyablement simple et (2) ils s'intègrent bien avec le reste du système. Si vous le souhaitez (1), il n'y a pratiquement aucun moyen de contourner une syntaxe aussi simple que de Lisp.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X