簡體   English   中英

在slime REPL中使用clojure.contrib函數

[英]Using clojure.contrib functions in slime REPL

我想在REPL的slime中使用clojure.contrib.trace命名空間中的函數。 如何讓粘液自動加載? 一個相關的問題,如何將特定的命名空間添加到正在運行的repl中?

在clojure.contrib API上,它描述了這樣的用法:

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

但是將其添加到我的代碼會導致無法使用跟蹤命名空間中的任何函數加載“無法解析符號”錯誤的文件。

我使用leiningen'lein swank'啟動ServerSocket,project.clj文件看起來像這樣

 (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"]])

一切似乎都是最新的,即'lein deps'不會產生任何變化。 那么這是什么一回事?

  1. 您將獲得“無法解析符號”異常,因為:require不會從給定的命名空間中提取任何Vars,它只會使命名空間本身可用。

    因此,如果您(:require foo.bar)ns的形式,你必須寫foo.bar/quux訪問瓦爾quux從命名空間foo.bar 您也可以使用(:require [foo.bar :as fb])將其縮短為fb/quux 最后的可能性是寫(:use foo.bar) ; 這使得命名空間中的foo.bar所有Vars foo.bar可用。 請注意,它通常被認為是不好的風格:use外部庫; 但是,在一個項目中它可能還可以。

  2. Re:自動在REPL上提供東西:

    :require:use:refer ns表單的:refer子句在clojure.core中的requireuserefer函數中有對應項。 還有一些宏對應於:refer-clojure:import

    這意味着為了使clojure.contrib.trace在REPL上可用,您可以執行類似(require 'clojure.contrib.trace)(require '[clojure.contrib.trace :as trace]) 請注意,因為require是一個函數,所以需要引用庫規范。 userefer也引用引用的lib規范; importrefer-clojure不需要引用。)

    每次啟動Clojure REPL時(包括使用SLIME執行此操作時)都可以使用某些命名空間的最簡單方法是在~/.clojure/user.clj放入相應的require調用。 請參閱John Lawrence user.clj的“ 要求所有可能的命名空間博客文章”,以了解您可能會在user.clj中提取所有內容的內容(我不做的事情,就個人而言,雖然我確實有(use 'clojure.contrib.repl-utils)在那里)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM