[PYTHON] Aide-mémoire sur le style de livraison continue (CPS)

Comme d'habitude, cela a semblé utile pour au moins une personne (moi-même), donc le style Continuation-passant (CPS) de chaque langue. L'exemple de description de est résumé sous forme d'article.

Python (Python 3): avec commentaire

En mode interactif, remplacez 10 par «x», puis évaluons «x + 20».

>>> x = 10
>>> x + 20
30

Lorsque je transforme cette description de programme dans un fichier et que je laisse l'interpréteur Python l'exécuter, rien ne s'affiche. En effet, en mode interactif (REPL), le résultat évalué en tant qu'expression est affiché, alors que dans l'exécution du fichier (script), un tel affichage n'est pas effectué.

C:\Users\hoge>type sample.py
x = 10
x + 20
C:\Users\hoge>python sample.py

C:\Users\hoge>

Si vous souhaitez afficher le résultat de l'évaluation en exécutant le fichier, vous devez l'afficher en utilisant, par exemple, print après avoir obtenu le résultat de l'évaluation.

C:\Users\hoge>type sample.py
x = 10
print(x + 20)

C:\Users\hoge>python sample.py
30

C:\Users\hoge>

Ici, lorsque vous décrivez comme une expression, considérez un mécanisme dans lequel la fonction qui traite le résultat de l'évaluation doit être spécifiée. Ce qui suit est un exemple de définition d'une fonction cadd20 qui est appelée en passant le résultat de l'évaluation comme argument à la fonction f après avoir évalué x + 20, et en spécifiant print pour f. ..

C:\Users\hoge>type sample.py
def cadd20(x, f): f(x + 20)
x = 10
cadd20(x, print)

C:\Users\hoge>python sample.py
30

C:\Users\hoge\python>

De cette façon, la méthode de programmation qui suppose un mécanisme pour spécifier la procédure de traitement du résultat à l'avance est "[Style de passage continu](https://ja.wikipedia.org/wiki/%E7%B6%99%]. E7% B6% 9A% E6% B8% A1% E3% 81% 97% E3% 82% B9% E3% 82% BF% E3% 82% A4% E3% 83% AB) »(style de passage continu, CPS ). Ce style a été appliqué à diverses implémentations, y compris les formes inconscientes.

Il est facile de convertir une fonction en CPS, mais une certaine ingéniosité est nécessaire pour utiliser la fonction convertie. Ici, la conversion des fonctions existantes en CPS et des exemples d'utilisation sont affichés (le corps principal de cette feuille de triche).

from operator import add, sub, mul

# func(x, y) = (x + y) * (x - y)
def func(x, y): return mul(add(x, y), sub(x, y))

print(func(10, 20))    # => -300

def cps(f):
    def cps(x, y, c): return c(f(x, y))
    return cps

cps(add)(10, 20, print)    # => 30

def cfunc(x, y, c):
    return cps(add)(x,  y,  lambda c1:    # x + y -> c1
           cps(sub)(x,  y,  lambda c2:    # x - y -> c2
           cps(mul)(c1, c2, c)))          # c1 * c2 -> c

cfunc(10, 20, print)    # => -300

Scheme(Gauche,Guile)

; func(x, y) = (x + y) * (x - y)
(define (func x y) (* (+ x y) (- x y)))
(display (func 10 20))    ; => -300

(define (cps f) (lambda (x y c) (c (f x y))))
((cps +) 10 20 display)    ; => 30

(define (cfunc x y c)
  ((cps +) x y (lambda (c1)    ; x + y -> c1
  ((cps -) x y (lambda (c2)    ; x - y -> c2
  ((cps *) c1 c2 c))))))       ; c1 * c2 -> c
(cfunc 10 20 display)    ; => -300

Ruby(CRuby)

# func(x, y) = (x + y) * (x - y)
def func1(x,y) (x+y)*(x-y) end
p func1(10,20)    # => -300

add = -> x,y { x+y }
sub = -> x,y { x-y }
mul = -> x,y { x*y }
prn = -> x { p x }

cps = -> f { -> x,y,c { c.(f.(x,y)) } }
cps[add][10,20,prn]    # => 30

cfunc = -> x,y,c {
  cps.(add).(x, y, -> c1 {     # x + y -> c1
  cps.(sub).(x, y, -> c2 {     # x - y -> c2
  cps.(mul).(c1,c2,c) }) })    # c1 * c2 -> c
}
cfunc[10,20,prn]    # => -300

JavaScript(Node.js)

// func(x, y) = (x + y) * (x - y)
function func1(x,y) { return (x+y)*(x-y) }
console.log(func1(10,20))    // => -300

add = (x,y) => x+y
sub = (x,y) => x-y
mul = (x,y) => x*y

cps = f => (x,y,c) => c(f(x,y))
cps(add)(10,20,console.log)    // => 30

cfunc = function(x,y,c) {
    return cps(add)(x, y, c1 =>    // x + y -> c1
           cps(sub)(x, y, c2 =>    // x - y -> c2
           cps(mul)(c1,c2,c)))    // x * y -> c
}
cfunc(10,20,console.log)    // => -300

Remarques

Informations complémentaires sur l'article

Les références

modifier l'historique

Recommended Posts

Aide-mémoire sur le style de livraison continue (CPS)
Aide-mémoire au curry
Aide-mémoire SQLite3
feuille de triche pyenv
feuille de triche de commande conda
feuille de triche de commande ps
Aide-mémoire de l'API Spark
Aide-mémoire Python3 (basique)
Fiche technique PySpark [Python]
Feuille de triche de tri Python
feuille de triche de fichier de réglage tox
feuille de triche de réutilisation de la mémoire numpy
[Python3] Entrée standard [Cheet sheet]
Fiche technique de la science des données (Python)
Aide-mémoire sur les pièces jointes de l'API Slack
Fiche technique du didacticiel Python Django
feuille de triche de l'algorithme scikit learn
Apache Beam Cheet Sheet [Python]