en JavaScript:
function getTopCustomersOfTheYear(howManyCustomers, whichYear) {
// Some code here.
}
getTopCustomersOfTheYear(50, 2010);
Cía#:
public List<Customer> GetTopCustomersOfTheYear(int howManyCustomers,
int whichYear)
{
// Some code here
}
List<Customer> customers = GetTopCustomersOfTheYear(50, 2010);
en PHP:
public function getTopCustomersOfTheYear($howManyCustomers, $whichYear)
{
// Some code here
}
$customers = getTopCustomersOfTheYear(50, 2010);
¿Hay algún lenguaje que admita esta sintaxis?
function GetTop(x)CustomersOfTheYear(y)
{
// Some code here
}
returnValue = GetTop(50)CustomersOfTheYear(2010);
¿No es una forma más semántica y más legible de escribir una función?
Actualización: la razón por la que hago esta pregunta es que estoy escribiendo un artículo sobre una nueva sintaxis para un nuevo idioma. Sin embargo, pensé que tener esa sintaxis para declarar métodos podría ser mejor y más amigable para los desarrolladores y disminuiría la curva de aprendizaje del lenguaje, debido a que está más cerca del lenguaje natural. Solo quería saber si esta característica ya se ha contemplado o no.
programming-languages
language-design
syntax
Saeed Neamati
fuente
fuente
'hello world' indexOf: $o startingAt: 6
oRectangle width: 100 height: 200
. Por cierto, ¿qué hay de malo en esta pregunta?returnValue = GetTop(50, CustomersOfTheYear(2010))
lo que me parece igualmente legible, y en realidad más flexible / ortogonal. ... y sí, es una sintaxis normal.Respuestas:
Si y si. Sí, hay un lenguaje así, y sí, muchas personas lo encuentran más legible una vez que se acostumbran.
En Objective-C, el método sería:
Ese es en realidad un ejemplo bastante ingenioso que no se lee muy bien, así que aquí hay uno mejor del código real:
Que el prototipo de un método que devuelve una nueva instancia de UIColor utilizando los valores rojo, verde, azul y alfa. Lo llamarías así:
Lea más sobre nombres de mensajes con parámetros intercalados en el lenguaje de programación Objective-C .
fuente
+colorWithRed:blue:green:alpha:
. Me pasó a utilizar los nombres de los parámetros que coinciden con el método, pero podría fácilmente haber utilizador
,b
,g
, ya
. Con parámetros con nombre como ofertas de JavaScript, usaría los nombres reales dados para acceder a los valores. Los parámetros de nombres verdaderos también se pueden dar en cualquier orden, y los parámetros pueden ser opcionales. Muy similar, sí, pero fundamentalmente diferente.color(r=0xFF,g=0xFF,b=0x55)
ocolor(b=0x32,r=0x7F,a=.5,g=0xFF)
así sucesivamente. Llamemos a esos parámetros muy nombrados , entonces. :)Respuesta: smalltalk
http://en.wikipedia.org/wiki/Smalltalk
'hello world' indexOf: $o startingAt: 6
es como el de Java"hello world".indexOfStartingAt(o, 6)
Rectangle width: 100 height: 200
es como el de Javanew Rectangle(100, 200)
La sintaxis es ...
expression word1: parm1 word2: parm2 word3: parm3 ...
El nombre del método llamado es la concatenación de todas las palabras.fuente
Creo que está buscando la abstracción llamada " interfaz fluida (por la presente estoy haciendo un comentario, originalmente hecho por @Jesper, a una" respuesta ")". Este patrón ahora común se ha implementado con éxito en muchos lenguajes, de los cuales Objective-C es solo uno.
Aquí hay un ejemplo bastante limpio:
Se puede ver cómo algo como esto puede ser implementado en Randy Patterson 's Cómo diseñar una interfaz fluida .
Andre Vianna ofrece una breve historia y luego analiza las posibles implementaciones en dos partes más del artículo, incluida mucha información útil. Vianna vuelve a la vieja idea que encontré por primera vez en Smalltalk 80 llamada "en cascada ", que permitía enviar múltiples mensajes al mismo objeto. Se veía así:
Posteriormente, la conexión en cascada evolucionó hacia el " encadenamiento de métodos " , donde "Hacemos que los métodos modificadores devuelvan el objeto host, de modo que se puedan invocar múltiples modificadores en una sola expresión " . El encadenamiento de métodos más tarde se convirtió en el concepto de interfaz fluido que conocemos y usamos con frecuencia hoy en día. . Lo que planeas hacer se ve muy similar.
Ayende Rahien analiza cómo la "interfaz fluida" puede diferir significativamente de la "cadena de métodos" para merecer su propio nombre .
Las interfaces fluidas se ven comúnmente en algunas de las nuevas herramientas utilizadas en el desarrollo impulsado por el comportamiento (BDD) e incluso han llegado a NUnit , una importante herramienta de prueba de unidades .NET, en su nuevo modelo de afirmación basado en restricciones .
Estos enfoques básicos se han implementado posteriormente en otros lenguajes, incluidos Ruby, Python, C #, Objective-C y Java . Para implementar algo similar, querrá estudiar la idea del " cierre ", que es bastante fundamental para el encadenamiento y la fluidez.
Quizás puedas mejorar estos modelos; así es como obtenemos excelentes idiomas nuevos. Aún así, ¡creo que comprender completamente el encadenamiento de métodos y las interfaces fluidas te dará un excelente punto de partida para desarrollar tus ideas!
fuente
function GetTop(x)CustomersOfTheYear(y)
. Esta es una función única, no llamadas encadenadas a dos funciones diferentes.Objective-C hace eso. Aquí hay un prototipo típico:
Así es como se llama este método:
Objective-C se usa principalmente con Cocoa para Mac OS X y Cocoa Touch para iOS, pero gcc construirá el código de Objective-C en casi todas las plataformas en las que trabaja gcc.
fuente
En Common lisp, puede definir argumentos de palabras clave para una función como esta:
La función se llama así:
En Ada no necesita una declaración especial: puede llamar a cualquier procedimiento o función alternativamente enumerando los argumentos en orden o nombrando los argumentos de esta manera:
Finalmente, la biblioteca de impulso incluye una capa de hacks para agregar la función a C ++: http://www.boost.org/doc/libs/release/libs/parameter/doc/html/index.html
fuente
No pude encontrar el nombre, pero hay un patrón de diseño para lograr algo similar, donde una llamada a la función devuelve un nuevo objeto modificado como se describe. Por ejemplo:
No se usa con mucha frecuencia porque sus datos deben ser muy ortogonales para evitar una complejidad inmanejable bajo el capó, pero pueden ser útiles en las circunstancias correctas.
fuente
Python tiene parámetros de palabras clave. Ejemplo de definición de función
Ejemplo de llamada de función
(Entiendo que esto no está del todo en el espíritu de la pregunta original, pero si los parámetros de palabras clave en lisp califican, así que hazlo. En Smalltalk y Objective-C, sin embargo, las palabras clave entre argumentos son realmente parte del nombre / búsqueda de la función .)
fuente
Agda tiene notación mixfix
Cada vez que la función se nombra con un guión bajo, se puede dividir en dos partes con un argumento en el medio
fuente
Si bien no es un lenguaje de programación per se , Cucumber toma parámetros en el medio de los nombres de las funciones, que pueden incluir espacios y deben parecerse al inglés.
Sin embargo, las 'funciones' se definen en Ruby
fuente
En TeX puede definir macros que tengan un "patrón de argumento" que básicamente significa que su protocolo de llamadas es gratuito. Para su ejemplo específico, podría usar
Tenga en cuenta que también es posible deshacerse de él
;
si acepta jugar con registros:TeX le permite reconfigurar su lexer, y gracias a la
\afterassignment
macro que utilicé anteriormente, puede usar los procedimientos integrados para lex números. Es muy útil definir protocolos de llamadas muy concisos . Por ejemplo, es muy plausible escribir macros TeX que comprendan la notación Markdown para tablas.Ahora pregunta "¿cómo accedo a mi base de datos donde los clientes están almacenados desde TeX?", Pero esta es otra pregunta. :)
En Common lisp, definitivamente es posible definir una
query
macro que le permita escribirdonde getCustomers y OfTheYear se interpretan como símbolos. Es entonces el trabajo de la macro darle sentido. El lisp común es excelente en el dominio de la legibilidad del código (¡sí, lo digo en serio!) Porque el sistema macro permite crear fácilmente pseudo-idiomas ajustados para su aplicación. (Creo que se llaman lenguajes de aplicación).
PD: Parece que nadie citó C ++. Lo más cercano que puede llegar (sin el preprocesador) es
el truco es dejar que
getTopCustomers
devuelva una referenciaquery
(o cualquier otra cosa) que también implementeOfTheYear
. Puede crear este ejemplo en un lenguaje de consulta pequeño, pero luego debe identificar las propiedades finales (devolver un valor) o agregar unfinalise
método (realizar la búsqueda y devolver el valor). Si lo desea, también puede imitar los controladores de flujo de STL y escribir cosas comopero esto nuevamente va en la dirección de los lenguajes de aplicación.
Editar: Pasé por alto las respuestas de @han, que también citan Common Lisp y C ++ (¡pero no TeX!).
fuente
En JavaScript o en cualquier otro lenguaje que admita cierres, puede crear una función como esta:
fuente
var top5Func = getTopCustomersFunc(37);
. El '5' es engañoso aquí, pero el código funciona exactamente igual que si la variable hubiera sido nombradatop37Func
.Esto depende de su definición de "lenguaje", pero el marco de prueba de robotframework le permite definir palabras clave de esta manera. De su documentación sobre argumentos incrustados :
Lo anterior declara una nueva palabra clave (esencialmente una función) llamada "select $ {animal} from list" donde '$ {animal}' es un parámetro. Lo llamas como "seleccionar gato de la lista"
fuente
Informar 7.
Y así.
fuente
Las palabras clave de Common Lisp ya se han mencionado, pero las macros de Common Lisp también permiten esto con bastante facilidad:
Esto se puede llamar así:
Sin embargo, una cosa a tener en cuenta es que los términos
from
yat
no se aplican. Tiene que haber algo allí, omitirlos por completo es un error, pero dado que la macro simplemente los descarta, no importa mucho lo que están más allá de la legibilidad (lo cual es importante):fuente
En Clojure, es común usar argumentos de palabras clave para situaciones como esta, por ejemplo:
(get-customers :top 50 :year 2010)
Los argumentos de las palabras clave son bastante flexibles, pueden ser opcionales y tener valores predeterminados especificados, etc.
fuente
Puedes emular esto en python. Por ejemplo,
o incluso
fuente