js / console.log in ClojureScript

7

Ich möchte eine Funktion mit ClojureScript implementieren, um js/console.log wie folgt zu vereinfachen:

%Vor%

Aufruf: (log "foo" "bar") throws: TypeError: Illegal invocation

aber das funktioniert: (js/console.log "foo" "bar")

Was ist das Problem?

    
Chpt.X 16.06.2014, 08:10
quelle

6 Antworten

11

js/something dient zum Zugriff auf ein js-Objekt, aber danach sollten Sie keine Punkte verschachteln, da es sich nicht um eine clojure-kompatible Syntax handelt und diese entfernt wird. In älteren Versionen des Compilers (2138) funktioniert Ihr Code, aber es ist möglich, dass er in neueren Versionen des Compilers veraltet ist. Welche Version verwendest du?

Der richtige Weg wäre die Verwendung von js interop wie folgt: [Vorbehalt: siehe Kommentar unten von David Nolen, ClojureScript, leitender Entwickler]

%Vor%

Und noch kürzer, da console.log bereits variadic ist (einfach einen Alias ​​erstellen):

%Vor%     
Joaquin 16.06.2014 09:38
quelle
5

Sie können println auch einfach verwenden, wenn Sie dies zuerst an die Spitze Ihrer Datei setzen: (enable-console-print!).

    
johnbakers 23.06.2014 06:23
quelle
4

Und pprint wurde portiert:

%Vor%     
bbs 01.09.2015 14:48
quelle
3

Ich habe die tatsächliche Antwort gefunden

%Vor%     
Stuart Mitchell 24.06.2015 03:00
quelle
2

Hier ist ein funktionierender Code für Ihre Funktion (getestet mit [org.clojure / clojurescript "1.7.228"]):

%Vor%

Hier ist ein Artikel, der beschreibt, warum (apply ...) nicht gut mit JS-Funktionen spielt. Ссылка

    
oshyshko 13.02.2016 06:33
quelle
1

Mit console.log ist es sinnvoll, ein Makro anstelle einer Funktion zu verwenden. Wenn Sie log als Funktion implementieren, werden alle Nachrichten mit der Zeilennummer von wo Ihre log Funktion definiert ist, protokolliert.

Ein Makro löst dieses Problem durch Erzeugen von Inline-Code während der Kompilierung. Es ist wichtig zu verstehen, dass Makros zur Kompilierungszeit ausgeführt werden .

Definieren Sie dieses Makro in macros.cljc :

%Vor%
  • ': ist wie ' oder quote aber:
    • Symbole werden automatisch aufgelöst, um ihren Namespace einzuschließen, wodurch mehrdeutige Symbole zum Zeitpunkt der Auswertung verhindert werden.
    • Ausgewertete Formulare können mit ~ oder unquote eingefügt werden, wie ich es für msgs getan habe, indem ich @ hinzugefügt habe, um mehrere Argumente zu entpacken: ~@msgs . Weitere Informationen über Syntaxzitat .

Rufen Sie es dann von core.cljs :

auf %Vor%     
Marcs 08.04.2017 14:34
quelle

Tags und Links