6

imaginar un lenguaje sencillo (compuesta) donde las funciones se ven como:¿Existe una relación entre llamar a una función e instanciar un objeto en lenguajes funcionales puros?

function f(a, b) = c + 42 
    where c = a * b 

(dicen que es un subconjunto de Lisp que incluye 'defun' y 'dejar'.)

también imaginar que incluye inmutable objetos que se parecen:

struct s(a, b, c = a * b) 

una vez más una analogía a Lisp (esta vez un superconjunto), según una definición de esa estructura generaría funciones para:

make-s(a, b) 
s-a(s) 
s-b(s) 
s-c(s) 

Ahora, dada la configuración simple, parece claro que hay mucha similitud entre lo que sucede entre bastidores cuando llamas 'f' o 'make-s'. Una vez que 'a' y 'b' se suministran en el momento de la llamada/instancia, hay suficiente información para calcular 'c'.

Se podría pensar en crear instancias de una estructura como llamar a una función y luego almacenar el entorno simbólico resultante para su uso posterior cuando se invocan las funciones de acceso generadas. O podría pensar en una función de evaluación como crear una estructura oculta y luego usarla como el entorno simbólico con el cual evaluar la expresión del resultado final.

¿Está mi modelo de juguete tan simplificado que es inútil? ¿O es realmente una forma útil de pensar cómo funcionan los lenguajes reales? ¿Hay alguna lengua/implementación real que alguien sin experiencia en CS pero con un interés en los lenguajes de programación (es decir, yo) deba aprender más sobre esto para explorar este concepto?

Gracias.

EDIT: Gracias por las respuestas hasta ahora. Para elaborar un poco, creo que lo que me pregunto es si hay algún idioma real en el que las personas que están aprendiendo el idioma sepan, por ejemplo. "Deberías pensar en objetos como esencialmente cierres". O si hay implementaciones de lenguaje real donde el caso de instanciar un objeto y llamar a una función realmente comparte algunas estructuras de datos o códigos comunes (no triviales, es decir, no solo llamadas de biblioteca).

¿La analogía que estoy haciendo, que sé que otros han hecho antes, va más allá de la mera analogía en cualquier situación real?

+0

Bueno, ciertamente hay una analogía. 'make-s' podría verse como fábrica, que es por definición una función. Y, de hecho, me pareció interesante, aunque no demasiado relevante para mi codificación-fu, pensar en métodos (incluidas fábricas/constructores) como funciones y el alcance de una función como un símbolo (/ cadena) => asignación de valores. Python hace ambas cosas. +1 porque me encanta en tales cosas. – delnan

+0

tipo de temas relacionados: http://stackoverflow.com/questions/2497801/closures-are-poor-mans-objects-and-vice-versa-what-does-this-mean – missingfaktor

Respuesta

1

Tanto f y make-s son funciones, pero el parecido no va mucho más allá. Al aplicar f se llama a la función y se ejecuta su código; aplicando make-s crea una estructura.

En la mayoría de las implementaciones de lenguajes y modelizaciones, make-s es un tipo diferente de objeto desde f: f es un cierre, mientras que make-s es un constructor (en los lenguajes funcionales y significado lógica, que es cerca del objeto lenguajes orientados significado) .

Si te gusta pensar de forma orientada a objetos, tanto f como make-s tienen un método de aplicación, pero tienen implementaciones completamente diferentes de este método.

Si te gusta pensar en términos de la lógica subyacente, f y make-s tiene una acumulación de características en el constructor de tipos samme (el tipo de función constructora), sino que se construyen en diferentes formas y tienen diferentes reglas de destrucción (aplicación de función frente a la aplicación constructora).

Si quiere entender el último párrafo, le recomiendo Types and Programming Languages por Benjamin C. Pierce. Las estructuras se discuten en §11.8.

+0

Esta es también una respuesta muy útil. – jtolle

+0

Aunque acepté esta respuesta porque creo que es la que más se acerca a lo que me preguntaba, me gustaría resaltar la respuesta de @dave a continuación. Entre los dos, creo que es seguro decir que la respuesta es "no se implementarán idiomas en los que se desarrolle de esta manera, pero podría ser algo suficientemente simplificado (como un intérprete de cálculo lambda)". – jtolle

1

Existe una relación entre objetos y cierres. http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg03277.html

A continuación se crea lo que algunos podrían llamar a una función, y otros podrían llamar a un objeto:
Tomado de SICP (http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-21.html)

(define (make-account balance) 
    (define (withdraw amount) 
    (if (>= balance amount) 
     (begin (set! balance (- balance amount)) 
       balance) 
     "Insufficient funds")) 
    (define (deposit amount) 
    (set! balance (+ balance amount)) 
    balance) 
    (define (dispatch m) 
    (cond ((eq? m 'withdraw) withdraw) 
      ((eq? m 'deposit) deposit) 
      (else (error "Unknown request -- MAKE-ACCOUNT" 
         m)))) 
    dispatch) 
+0

Gracias por los enlaces. Sé que hay una analogía entre objetos y cierres. Vea mi edición de mi pregunta, pero me pregunto si alguna vez va más allá de una simple analogía, al menos en el caso de la relación entre crear instancias de un objeto inmutable y llamar a una función. – jtolle

1

Es mi modelo de juguete de manera simplista que es inútil?

Esencialmente, sí. Su modelo simplificado básicamente se reduce a decir que cada una de estas operaciones implica realizar un cálculo y colocar el resultado en algún lugar. Pero eso es tan general, cubre todo lo que hace una computadora. Si no realiza un cálculo, no estaría haciendo nada útil. Si no pusiste el resultado en algún lugar, habrías hecho el trabajo por nada ya que no tienes forma de obtener el resultado.Entonces, cualquier cosa útil que haga con una computadora, desde agregar dos registros juntos hasta buscar una página web, se podría modelar como realizar un cálculo y colocar el resultado en algún lugar al que se pueda acceder más adelante.

+0

Tanto esta respuesta como z5h son útiles para mí, pero vea mi pregunta editada y el comentario que dejé en la respuesta de z5h. Claramente, la analogía tal como la has descrito es inútil. Pero estaba intentando restringirlo ... a la creación de instancias de objetos inmutables y al llamado de funciones. Eso hace una diferencia? – jtolle

3

No se puede obtener mucho más puro que el cálculo lambda: http://en.wikipedia.org/wiki/Lambda_calculus. El cálculo lambda es, de hecho, tan puro, ¡solo tiene funciones!

Una forma estándar de la aplicación de un par en el cálculo lambda es así:

pair = fn a: fn b: fn x: x a b 
first = fn a: fn b: a 
second = fn a: fn b: b 

Así pair a b, lo que podríamos llamar una "estructura", es en realidad una función (fn x: x a b). Pero es un tipo especial de función llamada cierre. Un cierre es esencialmente una función (fn x: x a b) más valores para todas las variables "libre" (en este caso, a y b).

Así que sí, crear instancias de una "estructura" es como llamar a una función, pero lo más importante, la propia "estructura" es como un tipo especial de función (un cierre).

Si piensa en cómo implementaría un intérprete de cálculo lambda, puede ver la simetría desde el otro lado: podría implementar un cierre como una expresión más una estructura que contenga los valores de todas las variables libres.

Lo siento si esto es tan obvio y sólo quería un poco de ejemplo del mundo real ...

+0

Esto es muy útil. La meta-pregunta real para mí es aprender a pensar en diferentes lenguajes no como bolsas de elementos sintácticos independientes que se pueden combinar para hacer cosas, sino como "envoltorios" relacionados (aunque con sintaxis específicas) para conceptos más fundamentales. ¡Gracias! – jtolle

+3

@jtolle: Puede que le interese el libro * Conceptos, técnicas y modelos de programación de computadoras * de Peter van Roy y Seif Haridi. Sostienen que los lenguajes de programación se pueden descomponer de acuerdo con los * Paradigmas * que admiten (por ejemplo, OOP o Programación Lógica), y esos paradigmas se pueden descomponer aún más en * Conceptos *. Peter van Roy tiene este gran póster con la * Clasificación de los principales paradigmas de programación *, que enumera 34 paradigmas, que se componen de aproximadamente 18 conceptos. Entonces, esos "conceptos fundamentales" que está buscando ... ¡incluso * los llaman * eso! –

+0

@Jorg W Mittag, gracias por esa recomendación! Página del libro aquí: http://www.info.ucl.ac.be/~pvr/book.html, enlace al borrador disponible libremente publicado por el autor aquí: http://lambda-the-ultimate.org/node/3108 # comment-45392, Poster aquí: http://www.info.ucl.ac.be/~pvr/paradigms.html, aspecto accesible ("paradigmas de programación para principiantes") artículo aquí: http://www.info. ucl.ac.be/~pvr/VanRoyChapter.pdf – jtolle

Cuestiones relacionadas