功能:
给定列表lst返回列表的内容的所有排列,其长度为k,如果未提供,则默认为列表的长度.
(defun permute (lst &optional (k (length lst)))
(if (= k 1)
(mapcar #'list lst)
(loop for item in lst nconcing
(mapcar (lambda (x) (cons item x))
(permute (remove-if (lambda (x) (eq x item)) lst)
(1- k))))))
Run Code Online (Sandbox Code Playgroud)
问题:我在连接到sbcl的emacs中使用SLIME,我还没有做太多的自定义.该功能在较小的输入上工作正常,例如lst ='(1 2 3 4 5 6 7 8)k = 3,这在实践中主要用于它.但是,当我连续两次使用大输入调用它时,第二个调用永远不会返回,而sbcl甚至不会显示在顶部.这些是REPL的结果:
CL-USER> (time (nth (1- 1000000) (permute '(0 1 2 3 4 5 6 7 8 9))))
Evaluation took:
12.263 seconds of real time
12.166150 seconds of total run time (10.705372 user, …Run Code Online (Sandbox Code Playgroud) 我使用Aquamacs,而Aquamacs预先配备了SLIME.
(setq inferior-lisp-program "/usr/local/bin/sbcl") #####!!!
(add-to-list 'load-path "/Library/Application Support/Aquamacs Emacs/SLIME/contrib")
(add-to-list 'load-path "/Library/Application Support/Aquamacs Emacs/SLIME")
(require 'slime)
(slime-setup)
Run Code Online (Sandbox Code Playgroud)
正如在某处所要求的那样,我尝试通过添加此代码来使用Clojure.
(add-to-list 'load-path "~/clojure/clojure-mode")
(setq inferior-lisp-program "/Users/smcho/bin/clj") ################
(require 'clojure-mode)
(setq auto-mode-alist
(cons '("\\.clj$ . clojure-mode")
auto-mode-alist))
(add-hook 'clojure-mode-hook
'(lambda ()
(define-key clojure-mode-map "\C-c\C-e" 'lisp-eval-last-sexp)))
)
Run Code Online (Sandbox Code Playgroud)
我无法使用SLIME运行Clojure,但我对当前设置感到满意,唯一的问题是因为(setq inferior-lisp-program ...)代码,我必须.emacs根据我使用Clojure或SBCL来更改代码.
有什么方法可以解决这个问题吗?我可以选择多个(劣质)Lisps吗?
我可以让Clojure在Aquamacs上运行.有关Aquamacs问题,请参阅带有'lein swank'的Running Clojure.忘记上面写的设置,如果你想运行Aquamacs/Clojure.你只需要一行,(slime-setup '(slime-repl))和lein swank.
当我在emacs中从Swank repl运行Clojure代码时,主线程将使用printf将消息打印到repl.但是如果我运行代理或显式创建其他也打印的线程,有时输出不会显示,有时它会显示在我运行Swank的控制台窗口中.我很想知道为什么.
编辑:感谢丹尼尔的回答下面我现在知道了其他线程不必了绑定到REPL的输出.此代码有效,因为您从运行的位置传出.但是我的新问题是这个代码现在阻塞每个线程,所以不是并行运行,而是每次运行一个线程,所以我需要一个更多线程感知的输出方法.
(defn sleeper-thread [out id t]
"Sleep for time T ms"
(binding [*out* out]
(printf "%d sleeping for time %d\n" id t)
(Thread/sleep t)
(printf "%d slept\n" id)))
(defn test-threads [n out]
(dotimes [x n]
(.start (Thread. (#(sleeper-thread %1 %2 %3) out x (+ 2000 (rand-int 5000)))))))
Run Code Online (Sandbox Code Playgroud) 我将一个任务发送给代理,但是看不到我放入函数的任何打印语句的输出.如何在代理上跟踪代码执行?
编辑:原来我做在控制台中的输出,而不是在泥.现在的问题是,如何在SLIME中看到输出?
启动swank服务器时,没有设置要绑定的地址的参数:
* (describe 'swank:create-server)
=> ...
Lambda-list: (&KEY (PORT DEFAULT-SERVER-PORT)
(STYLE *COMMUNICATION-STYLE*) (DONT-CLOSE *DONT-CLOSE*)
(CODING-SYSTEM *CODING-SYSTEM*))
...
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
两个插件都有良好的侧面,SLIMV有更好的REPL(比vimclojure REPL更快),但vimclojure的缩进和语法着色更好(同样,vimclojure的语法着色也在REPL中工作).而vimclojure的缩进更好.例如,这是函数的SLIMV缩进:
(defn func
[])
Run Code Online (Sandbox Code Playgroud)
这是vimclojure的:
(defn func
[])
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用两个插件,每个插件都有良好的侧面.我需要在SLIMV REPL和vimclojure缩进中进行语法着色.你有什么想法我该怎么做?
短版本:使用lein swank启动swank服务器时运行Mx slime-connect或Mx clojure-jack-in时出错.
我在Ubuntu 10.10上使用emacs 24.0.50.1.我在ELPA的emacs中安装了以下软件包:clojure-mode,paredit,slime,slime-repl
我从github安装了leiningen并将其添加到类路径中,然后运行
lein plugin install swank-clojure 1.3.3.之后我创建了一个新的目录〜/ tmp /,cd进入它并运行:
lein new test-project这似乎设置一切正常.然后我在emacs中打开了/tmp/new-project/project.clj并将其更改为:
(defproject test-project "1.0.0-SNAPSHOT"
:description "Test Project"
:dependencies [[org.clojure/clojure "1.2.1"]
[org.clojure/clojure-contrib "1.2.0"]]
:dev-dependencies [[swank-clojure "1.3.3"]])
Run Code Online (Sandbox Code Playgroud)
在那之后我又回到在/ tmp /新项目文件夹,跑lein deps然后lein swank下载依赖关系,并开始这给输出斯旺克服务器:
Connection opened on local port 4005.
Run Code Online (Sandbox Code Playgroud)
回到emacs是我遇到连接到swank服务器的问题.我试过打开core.clj文件并运行M-x slime-connect它会产生错误:
Symbol's function definition is void: define-slime-contrib
Run Code Online (Sandbox Code Playgroud)
这让我觉得它或者看不到swank服务器正在运行,或者有一些配置需要为它查看服务器.我也尝试过(打开同一个文件并打开project.clj)M-x clojure-jack-in我假设尝试在项目文件夹中启动clojure REPL但是它提供了以下内容:
Debugger entered--Lisp error: (error "Could not start swank server: sh: lein: not found
")
signal(error ("Could …Run Code Online (Sandbox Code Playgroud) 是否可以在Emacs中查看Clojure功能文档?也就是说,我可以配置Emacs来查找光标下的Clojure函数吗?
我正在使用clojure-mode和SLIME.奇怪的是,我甚至无法使用apropos或dir在SLIME的repl中,尽管它们是自动加载的lein repl.
这是一个真正的问题,不是为了开始一场火焰战争.
我使用Vim超过10年了; 看着人们使用Emacs/Slime ......让我决定学习Emacs/Slime.
我想尽快加快速度:
我本能地做了一堆"手指宏" - 我想找出Emacs/Slime中的等价物并重新训练自己
由于我熟悉Clojure,编写elisp配置不会有问题(有时减去动态变量)
我应该阅读/记忆什么?
编辑:注意,我尝试过VimClojure,并决定更喜欢Slime/Swank.
我经常发现自己从REPL开始一个长时间运行的过程,然后希望我可以在运行时继续使用REPL执行其他任务.我可以使用slime来设置当前线程或启动一个新的REPL控制线程吗?启动一个额外的REPL缓冲区也没问题.