Le défi
Écrivez un programme qui génère Hello World, from line X!
, où X
est le numéro de ligne, dans le code source, de l'instruction d'impression proprement dite.
Les règles
- Dans ce contexte, nous voulons que le premier numéro de ligne de l'instruction qui produit la chaîne soit affiché pour
stdout
- Vous devez éviter de simplement chercher dans votre code source sous forme de chaîne (fichier ou quine) pour trouver le numéro de ligne
- Si des espaces ou des instructions supplémentaires (qui n'interrompent pas le flux du code) sont ajoutés au code source, ils doivent être reflétés au moment de l'exécution (après la compilation, le cas échéant)
Recommandations
Si fourni par le langage, vous pouvez utiliser des exceptions / traces de pile pour atteindre cet objectif. Faites de votre mieux pour utiliser du code portable sur différents systèmes / implémentations, mais notez que ce n'est pas une exigence. L'utilisation de variables définies comme __LINE__
, bien que permise par les règles, est déconseillée.
Le gagnant
Il s'agit d'un concours de popularité (terminé le 10 juin 2014), où la réponse votée le plus haut par la communauté sera déclarée gagnante sur la base des votes en cours à l'époque.
Lors du vote, veuillez considérer la créativité de la réponse de quelqu'un, son caractère élaboré ou intéressant . et les difficultés / contraintes du langage de programmation utilisé
Réponses:
Sinclair Basic
Cela fonctionnera pour n'importe quelle ligne en
PEEK
ing à l'adresse stockant le numéro de ligne actuel, donc les éléments suivants fonctionneront également:la source
STR$
si vous remplacez les+
signes par des points-virgules?+
s par habitude.DE BASE
Je pense que cela fait tout ce qui était demandé:
la source
If any additional whitespace or statements (which do not interrupt the flow of the code) is added to the source code, it should be reflected at run-time (after compiling if applicable)
. L'intention est là. De plus, c'est la première ligne de la source, pas la 10e.Java
la source
Thread.currentThread().getStackTrace()
getLineNumber()
méthode sur la trace de la pile, tandis que la réponse à laquelle vous avez lié l'utilisetoString()
pour trouver le numéro de ligne.Perl
Pas aussi court que d'utiliser
__LINE__
, mais peut-être plus intéressant.la source
C ++
exemple en direct
la source
Lua
la source
C #
C # 5.0
[CallerLineNumber]
fait l'affaire:Sortie
la source
X
en chiffres romains est10
.C
la source
Python
Exemple (10 lignes, 213 caractères):
Essayez en ligne ici . Un code sans modification de flux et des espaces peuvent être ajoutés et le programme affichera le nombre de lignes mis à jour. De même, cet extrait de code peut également être utilisé n'importe où dans un programme existant. Production attendue:
Un autre exemple (essayez en ligne ici) pour montrer que cela fonctionne lorsque du code / espace est ajouté. Production attendue:
la source
Javascript
Remarque: les expressions, évaluées à partir de la console de développement Chrome seront enveloppées dans une
with
instruction. Nous devons donc décrémenter la ligne d'une unité si tel est le casla source
with
clause.Python 3
Ce code à lecture automatique contient un hachage auto-référencé. La somme SHA256 de la dernière ligne (avec les espaces de début et sans espaces de fin) commence par
cc46f7...
. Lorsqu'il hache laprint
ligne, il constate que le hachage correspond à la valeur magique qu'il recherche.la source
GNU COBOL
Eh bien, ils ont dit que cela ne pouvait pas être fait. En fait, c'est moi qui ai dit que cela ne pouvait pas être fait. Maintenant c'est fait, et une fonction de langage obsolète a été réimplémentée en utilisant la méthode appliquée.
La question dit:
N'importe quelle quantité de trucs peut être inséré avant les trois
DISPLAY
s qui provoquent le début de la sortie, et rien après leDISPLAY
s "interrompra le flux du code", donc c'est OK.COBOL avait un
TRACE
verbe (instruction) qui listait simplement les numéros de ligne source au fur et à mesure de leur exécution (pas d'accès au numéro de ligne dans le programme). Bien que d'utilisation limitée, j'ai inclus une implémentation de TRACE.La sortie est
Pour montrer la puissance et la flexibilité de l'écriture de la langue, cet exemple utilise à la fois des casse mixte, entièrement en minuscules et entièrement en majuscules. Peu importe, car lors du traitement, tout est "plié" en MAJUSCULE.
La seule façon COBOL standard d'obtenir un numéro de ligne source dans le programme en cours d'exécution, à partir du programme en cours d'exécution, est d'utiliser a
DEBUGGING
DECLARATIVE
. Dans unSECTION
, strictement dans un paragraphe dans unSECTION
, d'un tel déclaratif, vous avez accès au registre spécialDEBUG-LINE
. Il contient le numéro de ligne source du verbe (instruction) qui a provoqué le transfert du contrôle vers un nom de procédure particulier (paragraphe ouSECTION
).Donc avec
PERFORM
, ouGO TO
, ou "tomber" dans le paragraphe dans les déclarations de débogageSECTION
est exécuté.OK mais
DISPLAY
ne provoque pas de transfert de contrôle.Aucun problème. Mettez-le sur la même ligne que le transfert de contrôle.
Problème, car si "des espaces ou des instructions supplémentaires (qui n'interrompent pas le flux du code) sont ajoutés au code source, ils doivent être reflétés au moment de l'exécution (après avoir compilé le cas échéant)".
Donc, mettez-le sur la même ligne mais devant un transfert de contrôle, divisez le contenu du
DISPLAY
en deux morceaux (rappelez-vous, "Dans ce contexte, nous voulons que le premier numéro de ligne de l'instruction qui génère la chaîne soit affiché" ) et sortir la première partie avant le transfert de contrôle, et la deuxième partie, depuis leDEBUG-LINE
, une fois à l'intérieur de la procédure de débogage.Le dernier bit délicat est pour la "chute" (les "procédures" peuvent être
PERFORM
éditées, peuvent être la cible d'unGO TO
, ou peuvent être entrées simplement en étant la ligne suivante le long). Dans ce cas, mettez leDISPLAY
sur la ligne qui définit la procédure, mais devant la définition .Les noms des "procédures" (
a
etb
) ont été considérablement raccourcis pour leur permettre de tenir sur la même ligne source que leDISPLAY
. Strictement, un nom de procédure COBOL devrait commencer quelque part de la colonne huit à la colonne 11. Cependant, la syntaxe est, de nos jours, beaucoup plus détendue à ce sujet. Dans la mesure où je peux définir un nom de procédure sur la même ligne qu'un code. Même intégré dans le code. Des soins et un arrêt complet occasionnel sont nécessaires.dans le
PROCEDURE DIVISION
chaque point d'arrêt indiqué est requis, et pas plus.Compiler:
Pour exécuter (linux):
Enfin, le retour de TRACE (sans READY / RESET).
La sortie est:
Où 1, 2 et 3 sont sortis des trois instructions DISPLAY, et 17, 18, 19 et 20 sont les numéros de ligne des lignes "exécutables" (sans débogage).
la source
Java
Utilisation du comportement de la trace de pile d'Exception pour obtenir la ligne actuelle. tant que Printstatement n'est pas modifié en plusieurs lignes ou que le fichier de classe est modifié, cela devrait fonctionner
la source
Python
la source
Perl
la source
Java
la source
Python
Sortie
la source
Befunge
Fait juste pour le plaisir.
Conditionnel: le coin supérieur gauche du code doit être 0 <x <20 et 0 <= y <62; et les deux premières cellules doivent être vides.
Exemple:
Produirait:
Bonjour, de la ligne 10
la source
C
En utilisant une macro variadique, nous pouvons créer une fonction d'impression qui ajoute automatiquement le numéro de ligne à la fin d'une instruction printf arbitraire, et imprime toujours sur stdout.
test.c:
les sorties:
Remarque: J'ai dévié du modèle pour démontrer que printfl est toujours une fonction variadique valide; si vous vous souciez vraiment du format de la sortie, vous pouvez toujours changer les littéraux que j'utilise.
la source
Frapper
Sortie
la source
ré
la source
C ou C ++ et AWK
lineno.c:
Usage:
Sortie:
Bonjour, le monde, de la ligne 3
Remarques:
la source
Type d'ennui dans Ruby:
Ce n'est pas de la triche, non?
la source
Javascript
Une ligne utilisant la trace de pile.
la source
Cobra
la source
Rubis
la source
PowerShell
Mouvement pas cher
la source
Powershell
Et:
Les deux fonctionnent comme ceci:
la source
Write-Host
n'écrit pas sur stdout. Le simple fait de passer la chaîne l'enverra à stdout. Par exemple"Hello World, from line {0}!" -f (gcs| %{$_.ScriptLineNumber})[0]
Python
Court et doux.
la source
Perl
Un autre Perl:
la source