2013-03-12 3 views
8

Quando ho eval questo codice in lighttable:"Nessun lettore funzione" errore utilizzando Datomic nella Tabella Luce

(ns app.core 
    (:require [datomic.api :refer [q] :as d] 
      :reload-all)) 

(defn add-person 
    [conn id] 
    (d/transact conn [{:db/id #db/id[:db.part/user -1000001] 
        :person/id id}])) 

ottengo:

clojure.lang.ExceptionInfo: No reader function for tag id 
core.clj:4327 clojure.core/ex-info 

Chiunque sa che cosa sta succedendo?

+1

Il letterale '# db/id' è il colpevole. – vemv

risposta

0

Sembra che ci sia un problema con il tentativo di impostare :person/id. Dopo la parte #db/id[:db.part/user -1000001], hai un ID temporaneo per l'aggiunta di dati.

Dovresti essere in grado di iniziare ad impostare gli attributi per l'entità usando cose come :person/name name.

Se si sta tentando di creare un tipo di "ID pubblico", questo blog post potrebbe essere utile.

2

Questo tutorial è attribuita a stuart halloway e Bobby Calderwood:

(use :reload 'datomic.samples.repl) 
(easy!) 
(def conn (scratch-conn)) 

;; in data, use data literals for tempids 
(def tx-data [{:db/id #db/id[:db.part/user] 
       :db/doc "Example 1"}]) 
(transact conn tx-data) 

;; in code, call tempid to create tempids 
(let [id (tempid :db.part/user) 
     doc "Example 2"] 
    (transact conn [{:db/id id :db/doc doc}])) 

;; same argument applies to functions: 
;; use #db/fn literals in data 
;; use Peer.function or d/function in code 

;; broken, uses db/fn literal in code 
(transact conn [{:db/id #db/id [:db.part/user] 
       :db/ident :hello 
       :db/fn #db/fn {:lang "clojure" 
           :params [] 
           :code '(println :hello)}}]) 

;; corrected: used d/function to construct function 
(transact conn [{:db/id (d/tempid :db.part/user) 
       :db/ident :hello 
       :db/fn (d/function {:lang "clojure" 
            :params [] 
            :code '(println :hello)})}]) 
(d/invoke (db conn) :hello) 

Fonte: https://github.com/Datomic/day-of-datomic/blob/master/samples/literals_vs_code.clj

0

E 'un problema in nREPL. Il modo in cui ho risolto questo è quello di avviare il REPL dalla riga di comando con:

lein repl 

Questo avvierà un processo che è possibile connettersi a da LightTable o Emacs. Si stamperà informazioni come:

nREPL server started on port 51395 on host 127.0.0.1 
          ^^^^^ 

Ora in LightTable, Aggiungere una connessione -> Clojure Remote -> 127.0.0.1:XXXXX

Il XXXXX deve essere uguale alla porta stampata da Lein repl.

Se sei in Emacs, il sidro ha lo stesso problema. Segui le stesse fasi di avvio di lein repl, quindi usa M-x cider-connect (la combinazione di tasti predefinita è C-c M-c).