20

En Ruby, una convención estándar es utilizar un signo de interrogación al final de un nombre de método para indicar el método devuelve un resultado booleano:El uso de caracteres especiales en los nombres de las funciones

[].empty? #=> true 

Otra convención estándar es terminar un nombre de método con un signo de exclamación si el método es destructivo (es decir, modifica los datos originales):

mylist.sort! # sort mylist in-place 

recientemente he visto estas mismas convenciones que se utilizan en el Esquema. Lo que me hace preguntarme, ¿qué otros idiomas usan/apoyan esta convención? ¿Hay otros caracteres especiales que se usan comúnmente para nombrar por estos u otros idiomas?

Respuesta

15

La respuesta es, por supuesto, el idioma (y la cultura del idioma) específico.

Por ejemplo, dependiendo del idioma, todas las siguientes son apropiadas: empty-p, empty ?, empty, is_empty o isEmpty. (Estos ejemplos son, por supuesto, no inclusivos).

Los ejemplos en la pregunta original provienen de Ruby, donde tal uso? y! para finalizar los nombres de métodos son, cuando sea apropiado, aceptados. Esta aceptación proviene de 1) fácilmente accesible como terminadores de símbolos en la gramática 2) uso de? y! en la biblioteca estándar. Sin embargo, debe tenerse en cuenta que! no se usa universalmente para implicar "efecto secundario" y generalmente solo está presente en formas alternativas: guardar/guardar !, ordenar/ordenar !, etc. Hay una abrumadora cantidad de métodos que realizan efectos secundarios que no tienen el ! prefijo.

Personalmente, si estuviera diseñando un lenguaje, ¿lo permitiría?,!y 'ser caracteres finales no cotizados válidos en nombres de símbolos. A pesar de que algunos lenguajes permiten el escape de símbolos completos, como Scala, tales símbolos generalmente se evitan porque es una pena tener que citarlos para su uso.

 
// in Scala, esp. with Java-compat, the last form is generally used although 
// the first two are perfectly valid -- do what makes sense in the language 
foo.`empty?` 
foo.empty_? 
foo.isEmpty 

Cuando en Roma ...

  • Scala - `` vacío o empty_?? (no es común)
  • C/C++/JS/Java/Python/Perl - ¿no? o! en identificadores; JS/Java permiten $; $ es un sigilo en Perl
  • C/C++/Perl/JS - ¿Manos arriba en el aire?
  • C# - IsEmpty (método o propiedad) o vacío (propiedad)
  • Python - is_empty o estaVacia por Guido-guía (aunque por lo general __len__ protocolo: if not len(foo): "empty!")
  • Java - estaVacia por guía de idiomas
  • Ruby - ¿Trailing especial? y! (¿citando?)
  • JS - acceso indirecto del identificador: obj ["¿vacío?"] (no es común para esto)
  • "Lisp" (convencional): vacío-p para el predicado; variaciones en el lector/cotización

Me alegro de ver las correcciones y/o adiciones - es solo una gota en una cubeta.

+0

Ayuda ayuda! ¿Cómo puedo convertir la parte inferior de esta publicación en una "wiki de la comunidad"? –

+0

Cualquiera puede editar su publicación, por lo que es una wiki de la comunidad. ¿Que estás tratando de hacer? Puedo incorporar estos y todos los comentarios de los demás en la pregunta original de alto nivel, por lo que hay una lista única para todos. –

+0

Preferiblemente solo para tener la lista en la parte inferior editada. No estaba seguro de que pudiera ser editado por otros. Este stackoverflow todavía es un poco nuevo para mí. –

-1

Si cuenta Javascript como un lenguaje, muchos marcos parecen hacer uso del carácter '$' para significar 'Selector'; Por ejemplo, uno puede usar $("id-of-some-item") en Prototype.js o $("#id-of-some-item") en jQuery para seleccionar una etiqueta que se escribió <div id="id-of-some-item">. El uso de estas funciones de selección es realmente bastante complicado y poderoso (si está interesado, revise su documentación de soporte en prototypejs.org y jquery.com), pero se reduce a hacer algo que considero semánticamente similar a lo que indicado.

De nuevo, esto es suponiendo que cuente con Javascript como idioma.

+12

* Si *? Eso es un poco duro, ¿no? – paxdiablo

+1

Oh, déjame sacar la cinta ... es incluso Turing completa. (Prueba de geek.) Sí, es un lenguaje de programación de computadora, tal vez no querido por algunos, pero Lemon Meringue Pie no deja de convertirse repentinamente en tarta porque detesto cómo sabe. –

+0

No contaría con esto ($ == Selector): http://stackoverflow.com/questions/205853/why-would-a-javascript-variable-start-with-a-dollar-sign –

1

Agregar "@" a un nombre de método (o cualquier identificador) en C# le permite nombrar ese método con una palabra reservada normalmente reservada.

void null() {} 
// Invalid token 'null' in class, struct, or interface member declaration 

void @null() 
// compiles 

No haga esto; es principalmente para código generado por máquina, como conjuntos de datos. MSDN page on the topic.

+0

¿Hay alguna manera de citar un identificador arbitrario en C#? –

3

No soy un gran admirador de los caracteres especiales en los nombres de las funciones, pero luego también voy a golpear hasta la muerte, con una varita de apio mojado para desentrañar el dolor, cualquiera que encuentre poniendo espacios en los nombres de archivo: -)

la variante ? la misma facilidad se puede hacer con algo así como isEmpty() y la variante ! con sortInPlace().

El inglés es un lenguaje muy adaptable, incluso sin la puntuación.

En cualquier caso, mis idiomas de elección (C y Java) usan la puntuación para todo tipo de cosas. Tenerlos también en identificadores haría que el análisis léxico fuera una pesadilla.

+3

"Tenerlos en identificadores también haría que el análisis léxico sea una pesadilla". Esta afirmación simplemente no es verdad. Si bien no defenderé la sintaxis de Ruby (que no está libre de contexto y tiene muchos caprichos extraños: por ejemplo, a??b:c), el uso de no [a-z _] [a-z0-9_] no es necesariamente más complicado de ejecutar a través de un lexer. Considere Scheme como un contra-ejemplo muy "simple" (y Perl como, quizás un buen ejemplo, aunque NO permite caracteres "especiales" en los identificadores). El uso de tales símbolos, sin embargo, está abierto a la opinión. –

+0

@ user166390 Ruby tiene una gramática más uniforme. Creo que no es sensible al contexto y se puede describir en BNF. C++ requiere contexto para analizar y no se puede describir en BNF. Agregar caracteres especiales a los identificadores complicaría el análisis sintáctico, pero estoy de acuerdo en que, en principio, el análisis sería posible, quizás incluso con rapidez, pero creo que el código para hacerlo sería difícil en la práctica. – Sqeaky

Cuestiones relacionadas