Question

Jeffrey Meunier a une implicite macro Curry , qui utilisations defmacro. Je me demandais si quelqu'un a jamais écrit cela avec la syntaxe des règles?

Était-ce utile?

La solution

Il y a un certain nombre de mises en œuvre de curry pour le schéma - ne peut être aussi élégant que Haskell, car il y a toujours des fonctions fonctions unaire, donc tout peut être étrillé. (Mais cela peut être mis en œuvre de cours dans un schéma assez puissant comme Racket .)

En ce qui concerne la macro que vous avez déterré - c'est un assez mauvais: non seulement il utilise une macro non hygiénique, qu'il appelle aussi eval explicitement, et repose sur une mise en œuvre d'environnements, etc. Mais il est facile de faire qui avec une simple macro syntax-rules. AFAICT, voici ce qu'elle met en œuvre:

(define-syntax-rule (clambda (x ... . r) b ...)
  (let ([len  (length '(x ...))] [real (lambda (x ... . r) b ...)])
    (let loop ([argss '()] [n 0])
      (lambda args
        (let ([n (+ n (length args))] [argss (cons args argss)])
          (if (>= n len)
            (apply real (apply append (reverse argss)))
            (loop argss n)))))))

Mais il y a une note importante ici. La page que vous référencez dit qu'un problème de la version de la fonction est qu'elle est explicite - mais il a aussi un avantage important: la mise en œuvre macro, vous devez définir une fonction à l'aide clambda, alors que la version fonctionnelle peut être utilisé avec tout construit en une fonction. Dans de nombreuses implémentations Scheme il y a des installations pour inspecter la arité d'une fonction, et d'utiliser ce qu'il est possible de mettre en œuvre une version de fonction curryfication qui sait quand appeler la fonction d'origine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top