Die Herausforderung
Schreiben Sie ein Programm , dass die Ergebnisse Hello World, from line X!
, wo X
ist die Zeilennummer, in der Quellcode der aktuellen Print - Anweisung selbst.
Die Regeln
- In diesem Zusammenhang möchten wir, dass die erste Zeilennummer der Anweisung, die die Zeichenfolge ausgibt , angezeigt wird
stdout
- Sie sollten es vermeiden, Ihren Quellcode einfach als Zeichenfolge (entweder Datei oder Quine) zu durchsuchen , um die Zeilennummer zu finden
- Wenn dem Quellcode zusätzliche Leerzeichen oder Anweisungen hinzugefügt werden (die den Codefluss nicht unterbrechen), sollten diese zur Laufzeit wiedergegeben werden (ggf. nach dem Kompilieren).
Empfehlungen
Wenn die Sprache dies vorgibt, können Sie Ausnahmen / Stack-Traces verwenden, um dieses Ziel zu erreichen. Versuchen Sie, Code zu verwenden, der auf verschiedenen Systemen / Implementierungen portierbar ist. Beachten Sie jedoch, dass dies keine Voraussetzung ist. Von der Verwendung definierter Variablen __LINE__
wird abgeraten, obwohl dies nach den Regeln zulässig ist.
Der Gewinner
Dies ist ein Beliebtheitswettbewerb (beendet am 10. Juni 2014), bei dem die von der Community am höchsten gewählte Antwort auf der Grundlage der aktuellen Stimmen zum Gewinner erklärt wird
Berücksichtigen Sie beim Abstimmen bitte die Kreativität der Antwort, wie ausführlich oder interessant sie ist. und die Schwierigkeiten / Einschränkungen der verwendeten Programmiersprache
quelle
Antworten:
Sinclair Basic
Dies funktioniert für jede Zeile unter
PEEK
der Adresse, in der die aktuelle Zeilennummer gespeichert ist. Daher funktioniert auch Folgendes:quelle
STR$
wenn Sie die+
Zeichen durch Semikolons ersetzen ?+
s aus Gewohnheit.BASIC
Ich denke, das macht alles, was gefragt wurde:
quelle
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)
. Die Absicht ist da. Dies ist auch die erste Zeile der Quelle, nicht die zehnte.Java
quelle
Thread.currentThread().getStackTrace()
getLineNumber()
Methode für den Stack-Trace verwendet, während in der von Ihnen verknüpften AntworttoString()
die Zeilennummer ermittelt wird.Perl
Nicht ganz so kurz wie mit
__LINE__
, aber vielleicht interessanter.quelle
C ++
Live-Beispiel
quelle
Lua
quelle
C #
C # 5.0
[CallerLineNumber]
macht den Trick:Ausgabe
quelle
X
in römischen Ziffern ist10
.C
quelle
Python
Beispiel (10 Zeilen, 213 Zeichen):
Versuchen Sie es hier online . Code und Whitespace, die den Fluss nicht verändern, können hinzugefügt werden, und das Programm zeigt die aktualisierte Zeilenzahl an. Ebenso kann dieser Code-Snippet überall in einem vorhandenen Programm verwendet werden. Erwartete Ausgabe:
Ein weiteres Beispiel (versuchen Sie es hier online), um zu zeigen, dass es funktioniert, wenn Code / Whitespace hinzugefügt wird. Erwartete Ausgabe:
quelle
Javascript
Hinweis: Ausdrücke, die in der Chrome-Dev-Konsole ausgewertet werden, werden in eine
with
Anweisung eingeschlossen. Daher müssen wir die Zeile um eins dekrementieren, wenn dies der Fall istquelle
with
Klausel eingeschlossen wird.Python 3
Dieser selbstlesende Code enthält einen selbstreferenzierenden Hash. Die SHA256-Summe der letzten Zeile (mit dem anfänglichen Leerzeichen und ohne nachfolgendes Leerzeichen) beginnt mit
cc46f7...
. Wenn es dieprint
Zeile hasht , stellt es fest, dass der Hash dem Zauberwert entspricht, nach dem es sucht.quelle
GNU COBOL
Nun, sie sagten, dass es nicht möglich sei. Eigentlich war ich es, der sagte, dass es nicht geht. Jetzt ist es geschafft und eine veraltete Sprachfunktion wurde mit der angewendeten Methode neu implementiert.
Die Frage lautet:
Jede Menge an Material kann vor den drei eingefügt
DISPLAY
s , die den Start der Ausgabe verursachen, und alles , was nach demDISPLAY
s würde „Unterbrechung der Strömung des Codes“, so dass das OK.COBOL hatte früher ein
TRACE
Verb (Anweisung), das einfach die Quellzeilennummern auflistete, als sie ausgeführt wurden (kein Zugriff auf die Zeilennummer im Programm). Obwohl dies nur von begrenztem Nutzen ist, habe ich eine Implementierung von TRACE hinzugefügt.Die Ausgabe ist
Als Beispiel für die Kraft und Flexibilität des Schreibens der Sprache werden in diesem Beispiel gemischte Groß- und Kleinbuchstaben gleichzeitig verwendet. Es spielt keine Rolle, wie bei der Verarbeitung alles in GROSSBUCHSTABEN "gefaltet" wird.
Der einzige Standard-COBOL-Weg, um eine Quell-Zeilennummer im laufenden Programm aus dem laufenden Programm zu erhalten, ist mit einem
DEBUGGING
DECLARATIVE
. Innerhalb einesSECTION
, ausschließlich innerhalb eines Absatzes innerhalb einesSECTION
, eines solchen Deklarativs haben Sie Zugriff auf das SonderregisterDEBUG-LINE
. Diese enthält die Quellzeilennummer des Verbs (Anweisung), das die Übertragung der Kontrolle auf einen bestimmten Prozedurnamen (Absatz oderSECTION
) verursacht hat.Also wird mit
PERFORM
, oderGO TO
oder "durchfallen" der Absatz in den Debugging-DeklarativenSECTION
ausgeführt.OK, aber
DISPLAY
keine Übertragung der Kontrolle.Kein Problem. Stellen Sie es in die gleiche Zeile wie die Übertragung der Kontrolle.
Problem: Wenn "zusätzliche Leerzeichen oder Anweisungen (die den Code-Fluss nicht unterbrechen) zum Quellcode hinzugefügt werden, sollten sie zur Laufzeit wiedergegeben werden (ggf. nach dem Kompilieren)".
Stellen Sie es also in dieselbe Zeile, aber vor einer Übertragung der Kontrolle, und teilen Sie den Inhalt von
DISPLAY
in zwei Teile. ) und geben Sie den ersten Teil vor der Übertragung der Kontrolle und den zweiten Teil aus dem ausDEBUG-LINE
, sobald Sie sich in der Debug-Prozedur befinden.Das letzte knifflige Bit ist für das "Durchfallen" ("Prozeduren" können
PERFORM
bearbeitet werden, können das Ziel von a seinGO TO
oder können einfach eingegeben werden, indem die nächste Zeile entlang ist). Setzen Sie in diesem Fall das ZeichenDISPLAY
in die Zeile, die die Prozedur definiert, jedoch vor die Definition .Die Namen der "Prozeduren" (
a
undb
) wurden stark gekürzt, damit sie in dieselbe Quellzeile passen wie dieDISPLAY
. Streng genommen sollte ein COBOL-Prozedurname irgendwo zwischen Spalte 8 und Spalte 11 beginnen. Allerdings ist die Syntax heutzutage viel entspannter. Soweit ich einen Prozedurnamen in derselben Zeile wie Code definieren kann. Sogar in Code eingebettet. Pflege und gelegentliches Anhalten sind erforderlich.Bei dem
PROCEDURE DIVISION
jeweils gezeigten Punkt ist und sind keine weiteren erforderlich.Kompilieren:
So führen Sie (Linux) aus:
Zum Schluss die Rückgabe von TRACE (ohne READY / RESET).
Ausgabe ist:
Wobei 1, 2 und 3 von den drei DISPLAY-Anweisungen ausgegeben werden und 17, 18, 19 und 20 die Zeilennummern der "ausführbaren" (nicht debuggenden) Zeilen sind.
quelle
Java
Verwenden des Verhaltens der Stapelablaufverfolgung von Exception, um die aktuelle Zeile abzurufen. Solange Printstatement nicht in mehrere Zeilen unterteilt ist oder die Klassendatei beschädigt wird, sollte es funktionieren
quelle
Python
quelle
Perl
quelle
Java
quelle
Python
Ausgabe
quelle
Befunge
Nur zum Spaß gemacht.
Bedingung: Oben links im Code muss 0 <x <20 und 0 <= y <62 sein; und die zwei ersten Zellen müssen leer sein.
Beispiel:
Würde ausgeben:
Hallo, ab Zeile 10
quelle
C
Mit einem variablen Makro können wir eine Druckfunktion erstellen, die die Zeilennummer automatisch an das Ende einer beliebigen printf-Anweisung anfügt und immer auf stdout druckt.
test.c:
Ausgänge:
Hinweis: Ich bin vom Muster abgewichen, um zu demonstrieren, dass printfl immer noch eine gültige Variadic-Funktion ist. Wenn Sie sich wirklich für das Format der Ausgabe interessieren, können Sie die von mir verwendeten Literale jederzeit ändern.
quelle
Bash
Ausgabe
quelle
D
quelle
C oder C ++ und AWK
leineno.c:
Verwendung:
Ausgabe:
Hallo Welt, von Zeile 3
Anmerkungen:
quelle
Irgendwie langweilig in Ruby:
Das ist kein Betrug, oder?
quelle
Javascript
Eine Zeile mit Stack-Trace.
quelle
Kobra
quelle
Rubin
quelle
Power Shell
Günstiger Umzug
quelle
Power Shell
Und:
Beide arbeiten so:
quelle
Write-Host
schreibt aber nicht an stdout. Durch einfaches Übergeben der Zeichenfolge wird sie an stdout gesendet. ZB"Hello World, from line {0}!" -f (gcs| %{$_.ScriptLineNumber})[0]
Python
Kurz und bündig.
quelle
Perl
Ein anderes Perl:
quelle