¿Qué es idiomático?

19

Entiendo que un "idioma" es una operación o patrón común que en un idioma en particular no se simplifica por la sintaxis del lenguaje central, como el incremento de enteros:

i = i + 1;

En C ++, este modismo es simplificado por un operador:

++i;

Sin embargo, cuando alguien usa el término "idiomático", no estoy seguro de cómo entenderlo. ¿Qué hace que un código sea "idiomático"?

void.pointer
fuente
Esto pertenece tanto en english.stackexchange.com como aquí.
S.Lott
@ perl.j: perspicaz. Realmente has aclarado por qué la definición de "Idiomatic" no pertenece a english.stackexchange.com. Muy útil.
S.Lott

Respuestas:

24

Una forma idiomática de escribir algún código es cuando lo escribes de una manera muy específica debido a expresiones idiomáticas específicas del idioma que otros idiomas no tienen.

Por ejemplo, en C ++, explotar el idioma RAII conduce a formas de escribir código C ++ administrando recursos que son idiomáticos.

Otro ejemplo sería usar las comprensiones de listas en Python para generar listas. Es idiomático porque habrías usado la comprensión de listas en Python idiomático, pero podrías haber hecho lo mismo usando una función de generador en cualquier otro idioma o incluso en Python.

A menudo, alguien que prueba un nuevo idioma sin usar los modismos específicos de este idioma no escribirá código idiomático.

Klaim
fuente
Excelente descripcion. Entonces, en C #, si creo un método de extensión llamado TryAdd()en la Dictionaryclase Genérica para verificar primero !Contains()y luego llamar Add(), ¿sería idiomático? Estoy usando una función específica de C # - métodos de extensión.
void.pointer
1
No estoy seguro de que el codificador de C ++ más experimentado le diga que escriba funciones gratuitas para extender las clases en lugar de agregar miembros, siempre que sea posible. No es lo mismo que los métodos de extensión de C #, pero está bastante cerca y disponible para cualquier lenguaje que permita funciones gratuitas. De lo que estoy seguro es que escribir "set / getters" en C # usando propiedades ES idiomático.
Klaim
Pero esto no es C ++, por lo que usar la "forma C ++" podría no ser lo suficientemente "idiomático". El uso de un método de extensión aquí es razonable y muy similar a C #. En cualquier caso, fue un ejemplo, pero los métodos de extensión son muy idiomáticos para C #.
void.pointer
Sí, por eso dije "No estoy seguro", se siente idiomático pero está tan cerca de otras características básicas de otros lenguajes que no estoy seguro (porque no soy un desarrollador de C #). Tengo otro ejemplo: el bucle se realiza por recursividad en todos los lenguajes funcionales. Puede hacerlo en otros idiomas, pero claramente es idiomático para los lenguajes funcionales. No estoy seguro si ayuda.
Klaim
1
Por supuesto, Python va un paso más allá al tener una forma idiomática de referirse al código idiomático, es decir, pitónico. * 8 ')
Mark Booth
12

Definición normal

Usar, contener o denotar expresiones que son naturales para un hablante nativo

Definición de programación

El uso, que contiene o que denota expresiones que son naturales a un [Insertar el idioma] programador

ChaosPandion
fuente
1
Si pensara que las definiciones de "google" para este término fueron útiles, no habría publicado aquí. Quería una mejor descripción (como un tutorial) con ejemplos.
void.pointer
3
@Robert - Creo que no entiendo por qué no entiendes.
ChaosPandion
2
Leí tu respuesta primero, no estaba del todo claro. Después de leer la respuesta que ahora está marcada como mi respuesta, quedó muy claro lo que significaba "idiomático" y ahora lo entiendo. Ahora que leí tu respuesta tiene sentido. Sin embargo, no me guió a través de ejemplos y diferentes escenarios, por lo que creo que su respuesta no fue tan útil. Diste una respuesta de "webster" que es técnicamente correcta pero que no es útil en lo que respecta a ayudarme a entender. Aunque aprecio tu ayuda.
void.pointer
7

Idiomático en el contexto de la programación generalmente se puede definir como "la forma más natural de expresar algo en un lenguaje"

Veo que la palabra idiomática aparece particularmente en Ruby. En Ruby, hay capacidades masivas de metaprogramación, y para escribir código de Ruby idiomático, generalmente debe usarlas.

Tenga en cuenta que el hecho de que un código sea idiomático no significa que esté limpio o que sea conciso. Muchas veces debes hacer compromisos.

Básicamente, lo idiomático se refiere más comúnmente a la forma más común de escribir algo en un idioma, a menudo incluyendo "jerga" (modismos). Si un código no es idiomático, puede ser perfectamente legible, conciso, limpio y correcto, pero puede sentirse / verse incómodo en el lenguaje utilizado. Es preferible saber si reescribir idiomáticamente un código de este tipo sería algo bueno y debe juzgarse caso por caso.

El inglés idiomático, por ejemplo, puede depender de la región. El uso de la palabra bumprobablemente sea necesario para el inglés idiomático del Reino Unido, mientras que buttes más apropiado para el inglés de los EE. UU. (No sé mucho inglés británico tristemente: /)

Earlz
fuente
Gracias (upvoted), ¡creo que tu definición fue acertada para mí!
Ashaman Kingpin
3

El mejor ejemplo que puedo idear, fuera de mi cabeza, para algo que es idiomático, proviene de Ruby.

En una gran cantidad de idiomas, puede iterar con:

for( start; end; increment){
    code;
}

O algo muy similar. Muchos idiomas también tienen una foreach(x in SetOfXes)construcción. Pero la iteración que es idiomática para Ruby incluye cosas como:

collection.each do |current|
  current.do_stuff
end

e incluso

10.times do |x|
  puts x
end

Veo estos como idiomáticos porque representan una forma de hacer algo que es menos común, y que representa algo en el centro de la filosofía de su dominio. Ruby tiene una filosofía sobre la interacción con objetos que, aunque no es única, no es omnipresente.

En una nota semántica, cada vez que escucho la palabra idiomática, mi cerebro completa automáticamente el pensamiento como "idiomático para ...": simplemente lo analizo reflexivamente en relación con un tema específico.

asfallows
fuente
¿Cómo es collection.each do |current|diferente de foreach(current in collection)? Ambas son construcciones de bucle que se establecen currenten cada elemento de collection.
MSalters
2

Las expresiones idiomáticas suelen ser la mejor manera posible de expresar una situación común y relativamente compleja en un idioma. Incrementar no es un idioma ni nada por el estilo. Usando el incremento de prefijo en lugar de postfix, podría argumentar que es un idioma de C ++.

Los modismos son la mejor manera de usar un lenguaje, según lo determinen los usuarios expertos. Un idioma real de C ++ sería objetos de función. Otro idioma sería RAII. No hay nada en el lenguaje que le indique que debe liberar recursos en el destructor. Pero es idiomático hacerlo. Otro ejemplo son las plantillas: es idiomático usar plantillas para, bueno, todo lo que pueda, pero no hay nada que le impida usar la herencia en exceso.

DeadMG
fuente
Wikipedia utilizó el incremento como ejemplo, por eso lo mencioné en mi pregunta. ¿Por qué se requiere que los modismos sean complejos? Esto no parece ser parte de la definición basada en las otras respuestas.
void.pointer
44
@Robert Dailey: ¿Cómo podría ser un modismo el incremento? Es parte del lenguaje . Las expresiones idiomáticas son creadas por los usuarios de un idioma, cambian con el tiempo. Incrementar no es un idioma, es una funcionalidad básica del lenguaje. Tomando esa lógica, podría decir que cualquier otra función básica del lenguaje es una expresión idiomática y, por lo tanto, cada programa es idiomático, lo cual no es así.
DeadMG
2

Tu definición no me parece correcta. Un modismo es una forma de escribir algo que puede o no ser posible en otros idiomas, pero que es común en este idioma. Por lo general, es más corto que la alternativa, pero eso no es realmente un requisito.

Puede ser más fácil explicarlo hablando de lo que no es idiomático. En C ++, es bastante idiomático escribir:

Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y);
if(p)
{
 // whatever
}

Es aún más idiomático escribir:

Foo* p; 
if(p = SomeThingThatReturnsAFooPointer(arg, param, x, y))
{
 // whatever
}

Este código hace exactamente lo mismo: algunas personas que son nuevas en C ++ podrían leerlo como prueba para ver si p es igual a lo que devuelve la función, pero eso no es lo que hace.

Compare con lo que alguien podría escribir, de manera no idiomática, que ha venido de otro idioma:

Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y);
if(p !=NULL)
{
 // whatever
}

También verás estas cosas como no idiomáticas:

if (x>0)
  return true;
else
 return false;

Porque el enfoque idiomático es

return (x>0);

Las formas no idiomáticas no están mal, pero por lo general tardan más en escribir y siempre tardan más en leer, para aquellos que conocen los modismos. Si te llamo "el niño que lloró lobo" y conoces la historia, es más rápido que si te explico cómo las falsas alarmas hacen que la gente te ignore. El problema, por supuesto, es si no conoces la historia y no sabes qué tienen que ver los lobos con lo que estamos hablando. Del mismo modo, puede ser un problema si nunca return x<y;antes has visto y realmente no sabes lo que hace.

Kate Gregory
fuente
1
El enfoque idiomático seguramente sería declarar el puntero en la condición if, para que nunca se pueda acceder si no es NULL. if(Foo* p = SomeThingThatReturnsAFooPointer(arg, param, x, y))
DeadMG
mm, probablemente. O mil líneas antes porque se usa en todo este bloque. O en un archivo de encabezado porque es una variable miembro. Solo lo dije para que los lectores supieran que era un Foo *, tienes razón en que en la vida real no se declararía allí.
Kate Gregory el
1

Cuando hay múltiples formas de expresar algo, la forma más común o comúnmente aceptada. Por ejemplo, usando una declaración estructurada en C en lugar del equivalente exacto usando declaraciones goto.

hotpaw2
fuente