2010-05-18 9 views
14

Chcę używać funkcji w przestrzeni nazw clojure.contrib.trace w slime na REPL. Jak mogę pobrać śluz, aby załadować je automatycznie? Powiązane pytanie, jak dodać konkretny obszar nazw do działającego replika?Używanie funkcji clojure.contrib w slime REPL

na API clojure.contrib opisuje wykorzystanie tak:

(ns my-namespace 
    (:require clojure.contrib.trace)) 

Ale dodanie tego do moich wyników kod w pliku nie jest w stanie załadować z „Nie można rozwiązać symbol” błędu dla każdej z funkcji przestrzeń nazw śledzenia.

używam Leiningen 'Lein Swank', aby rozpocząć ServerSocket a plik project.clj wygląda następująco

(defproject test-project "0.1.0" 
    :description "Connect 4 Agent written in Clojure" 
    :dependencies [[org.clojure/clojure "1.2.0-master-SNAPSHOT"] 
        [org.clojure/clojure-contrib "1.2.0-SNAPSHOT"]] 
    :dev-dependencies [[leiningen/lein-swank "1.2.0-SNAPSHOT"] 
         [swank-clojure "1.2.0"]]) 

Wszystko wydaje się do tej pory, to znaczy 'Lein deps' nie wywołuje żadnych zmian. Więc co tam?

+1

Być może zechcesz oznaczyć odpowiedź Michała jako poprawną. –

+1

Tyler, powinieneś oznaczyć odpowiedź Michała jako zaakceptowaną odpowiedź na to pytanie, ponieważ wydaje się, że rozwiązał twój problem. Nie tylko jest to uważane za dobrą formę do tego, ale także daje trochę poprawy twojej reputacji.Wystarczy kliknąć znacznik wyboru obok wyniku pytania. –

Odpowiedz

18
  1. Dostaniesz „Nie można rozwiązać symbol” wyjątki ponieważ :require nie ciągnąć w dowolnym Vars z danego obszaru nazw, tylko to sprawia, że ​​sama przestrzeń nazw jest niedostępna.

    Zatem jeśli (:require foo.bar) w formularzu ns, trzeba napisać foo.bar/quux aby uzyskać dostęp do Var quux od nazw foo.bar. Możesz także użyć (:require [foo.bar :as fb]), aby skrócić to do fb/quux. Ostateczną opcją jest napisanie zamiast tego: (:use foo.bar); to sprawia, że ​​wszystkie warianty z foo.bar są dostępne w twojej przestrzeni nazw. Zauważ, że jest ogólnie uważany za zły w stosunku do bibliotek zewnętrznych :use; Prawdopodobnie jest to w porządku w ramach jednego projektu.

  2. Re: automatycznie czyni rzeczy dostępne w REPL:

    W :require, :use i :refer klauzule ns formy mają odpowiedników w funkcji require, use i refer w clojure.core. Istnieją również makra odpowiadające :refer-clojure i :import.

    Oznacza to, że w celu zapewnienia dostępności clojure.contrib.trace w REPL można zrobić coś w rodzaju: (require 'clojure.contrib.trace) lub (require '[clojure.contrib.trace :as trace]). Zauważ, że ponieważ require jest funkcją, musisz podać specyfikację biblioteki. (use i refer również wziąć Podane specyfikacje lib; import i refer-clojure nie wymagają cytowania.)

    Najprostszym sposobem, aby mieć pewne nazw dostępny przy każdym uruchomieniu się Clojure rEPL (w tym przypadku to zrobić z szlam) jest umieszczenie odpowiednie wywołania require w ~/.clojure/user.clj. Zajrzyj do posta na blogu Requiring all possible namespaces Johna Lawrence'a Aspdena, aby opisać, co możesz umieścić w user.clj, aby pobrać wszystkie z contrib (coś, czego nie robię, osobiście, chociaż mam tam (use 'clojure.contrib.repl-utils)).

+0

Wielkie dzięki! Debugowanie w Emacsie jest teraz znacznie łatwiejsze. – Limpoch

Powiązane problemy