2011-01-31 21 views
16

Qualcuno ha impostato qualcosa del genere per se stesso utilizzando il REPL nodo esistente? Non ho pensato a un modo veloce per farlo.node.js - evaling a un processo in tempo reale

Il modo in cui lo faccio oggi è usando emacs e questo: https://github.com/ivan4th/swank-js

Questo modulo è composto da:

  1. una melma-js addon per emacs, che, in combinazione con js2-mode , consente è sufficiente emettere un CMx qualche parte nel corpo di una funzione def - e fuori va stringa della funzione al ..

    server di
  2. Swank-js (sì, c Ould eval dal locale macchina direttamente a un processo remoto) scritto in Node.js - Riceve la stringa della funzione che si eval'ed e in realtà è evals

  3. tutta una parte che consente di connettersi a un altro porta su quel server con il browser e quindi consente di manipolare il DOM su quel browser (che è piuttosto sorprendente, ma non rilevante)

mia soluzione utilizza SLIME-js sul lato Emacs e ho bisogno di (' swank- js ') sul mio file app.js

Ora .. Ho diversi problemi e domande riguardanti la mia soluzione o altre possibili:

Q1: È questo strafare? Qualcuno ha un modo segreto per valutare le cose da nano nel suo processo live?

Q2: ho dovuto cambiare il modo in cui Swank-JS è EVALing .. è usato qualche sorta di magia nera in questo modo:


var Script = process.binding('evals').Script; 
var evalcx = Script.runInContext; 
.... 
this.context = Script.createContext(); 
for (var i in global) this.context[i] = global[i]; 
this.context.module = module; 
this.context.require = require; 
... 
r = evalcx("CODECODE", this.context, "repl"); 
che

, per quanto ho capito, solo copia le variabili globali per il nuovo contesto , e dopo l'eval, non modifica la funzione originale definizioni - SOOO .. Sto semplicemente usando "eval" semplice e IT FUNZIONA.

Avete commenti in merito?

Q3: Al fine di rivalutare una funzione, deve essere una funzione GLOBALE - È una cattiva pratica avere tutte le definizioni di funzione come globali (tipo clojure)? Pensi che ci sia un altro modo per farlo?

+0

In realtà, io sono molto interessato a anche questa domanda ... sospetto che giocare con la magia nera possa far pensare ad alcune risposte. So cosa farò oggi! –

risposta

2

In realtà, swank.js è sempre molto meglio, ed è ora molto più facile da impostare Swank js il vostro progetto utilizzando NPM. Sono in procinto di scrivere la documentazione in questo momento, ma la funzionalità è lì!

0

Si potrebbe dare un'occhiata a jsapp.us, che esegue JS in una sandbox, e quindi lo espone al mondo come un piccolo test server veloce. Ecco lo jsapp.us github repo.

Inoltre, si fermano in #node.js e fare domande per una risposta più rapida :)

2

check this out http://nodejs.org/api/vm.html

var util = require('util'), 
vm = require('vm'), 
sandbox = { 
    animal: 'cat', 
    count: 2 
}; 

vm.runInNewContext('count += 1; name = "kitty"', sandbox, 'myfile.vm'); 
console.log(util.inspect(sandbox)); 

// { animal: 'cat', count: 3, name: 'kitty' } 

Dovrebbe aiutare molto, tutte le cose sandbox per il nodo usa :) ma è possibile utilizzarlo direttamente :)