7
votes

Pouvez-vous me montrer comment réécrire les fonctions dans Lisp?

Considérez ce JavaScript:

(define addXCurry 
  (lambda (x)
    (lambda (n)
      (+ x n))))

(define add5 (addXCurry 5))
(add5 10)


1 commentaires

Stackoverflow.com/q/16380479/849891 fait savoir comment cela se fait dans Lisp de manière appropriée, Afaik - avec fermetures, Faire des fonctions dans des objets répondant aux messages: (amusement 'appelle arguments ...) ou (amusant' réinitialiser-x-à 5) (ou, ou, en C, en utilisant statique variables à l'intérieur des fonctions). Et non, ce n'est pas essentiellement sur le currying, même si cela pourrait être mis en œuvre avec un, syntaxiquement, superficiellement.


4 Réponses :


2
votes

Comment vous écrivez votre JavaScript suggère que vous recherchez une macro: xxx

donc cela vous donne: xxx < p> La macro vous donne ce que vous voulez en ce que ce n'est pas une fonction de currying usine et il ne réécrirea pas le nom de la macro pour que vous puissiez suivre les changements (bien que cela puisse être fait avec quelque chose de plus complexe), mais vous donne ce que vous voulez en ce qu'il vous permet de changer la fonction à la volée.


0 commentaires

3
votes

Notre code de procédure:

(define (replace x y list)
  (map (lambda (x.)
         (if (equal? x. x)
             y
             (if (list? x.)
                 (replace x y x.)
                 x.)))
       list))


3 commentaires

Merci! Cela nécessiterait d'écrire toutes les fonctions comme des listes et de les évaluer au début - ce ne serait-il pas?


Oui, c'est pourquoi les macros sont la manière la plus naturelle de le faire. Mais alors, tu voulais de la dure bien?


Je le pense. Je ne connais pas un moyen simple dans lequel on pourrait coupler le code avec la procédure de telle sorte que le couplage puisse être utilisé normalement comme une procédure mais sondé pour le code de celui-ci aussi, comme dans JavaScript.



16
votes

La partie difficile est que la LISP (et d'autres LISP communes) se débarrasse du code source. Surtout quand un compilateur est impliqué. Par défaut, le code source est parti et tout reste est le code de la machine. Comment récupérer la source LISP et dans quelle forme?

La raison derrière ceci: Pourquoi un programme CL devrait-il être nécessaire pour garder la source? Il pourrait être complètement compilé au code de la machine ou au code C et sans compilateur / eval au moment de l'exécution. Le programme pourrait fonctionner sans une grande partie de l'environnement de développement (pas de compilateur, etc.). L'environnement COMMON LISP ne doit pas non plus être en mesure de pouvoir «non commuter» le code de la source reconstruite. P>

aussi il est généralement compliqué. P>

CL-USER 12 > (function-lambda-expression #'addx)

(LAMBDA (N)
  (DECLARE (SYSTEM::SOURCE-LEVEL #<EQ Hash Table{0} 217874D3>))
  (DECLARE (LAMBDA-NAME ADDX))
  (+ N 3))
NIL
ADDX


0 commentaires

7
votes

L'exception semble être les exemples Dans la réponse de Rainer, qui sont tremblantes sol.

pourquoi? C'est la conclusion logique. Vous ne pouvez pas compter sur le compilateur en préservant la source, de sorte que vous le stockez vous-même.

Après cela, vous pouvez correctement Travailler avec la définition de la fonction (par opposition à JavaScript dans laquelle vous venez de pirater une représentation de chaîne, qui est un excellent exemple de truc shaky).


0 commentaires