我想知道在vim for Common Lisp中自定义自动格式化/自动缩进的最佳方法.
自动格式化(我通常通过在每行的命令模式下键入'=='来实现这一点)对于vim中的基本lisp语言非常有效(例如,defmacro,defun,lambda,if,with-output-to-string),但是任何时候定义新的语言结构(例如,使用宏),我发现新结构的格式通常不是我想要的.
例如,这里是vim格式'何时(标准lisp构造)和'awhen(通常使用的'当时的aaphoric版本;不是lisp标准的一部分)
(when 'this
(process 'this))
(awhen 'this
(process it))
Run Code Online (Sandbox Code Playgroud)
我想像''那样'自动格式化'.我有什么想法可以做到这一点?
编辑:感谢Gilligan和Tamas的Slimv推荐.作为测试,我下载了MacVim(将需要这个与终端vim一起工作,但这是一个不同的问题)和slimv,将精简版下载到〜/ .vim,启动MacVim,并加载.lisp文件.
然后我启动了lisp服务器(通过带有MacVim的GUI完成),它加载了我的默认lisp可执行文件和核心文件.
并且*因为我的核心文件已经加载了我常用的语言扩展名(awhen是其中之一),所以开箱即用的格式正确.
我非常喜欢这个解决方案.而不是[1]必须学习如何告诉vim正确缩进特定函数,[2]为我定义的每个语言扩展编写明确执行此操作的代码,并且[3]每次添加新代码时都会更新代码语言结构.相反,我利用slimv为我做格式化.而且,只要这些宏已经加载到服务器会话正在使用的lisp核心中,slimv就可以"学习"新的语言扩展.很漂亮!
我发现这适用于特定类型的语言扩展.通常使用&body关键字定义为宏.这似乎在大多数时候"做正确的事",但我使用的宏仍然没有正确自动格式化.虽然我会说这更像是宏写法(非标准语言扩展)的问题,而不是其他任何问题.
所以,对于大多数情况,这个解决方案对我来说效果很好,而且我不需要编码(和维护)任何东西.好东西!
假设我有矢量a
:
c(1, 6, 2, 4.1, 1, 2)
Run Code Online (Sandbox Code Playgroud)
和计数向量b
:
c(2,3,2,1,1,0)
Run Code Online (Sandbox Code Playgroud)
我想生成矢量c
:
c(1, 1, 6, 6, 6, 2, 2, 4.1, 1)
Run Code Online (Sandbox Code Playgroud)
致电:
hist(c)
Run Code Online (Sandbox Code Playgroud)
我如何构建c
,或者是否有直接从a
和生成直方图的方法b
?请注意重复内容a
以及不等间距.
需要矢量化解决方案.a
并且b
对于lapply和朋友来说太大了.
在我的设置中,PostgreSQL 9.2.2似乎在尝试将大型csv文件加载到表中时出错.
csv文件的大小约为9GB
这是我用来进行批量加载的SQL语句:
copy chunksBase (chunkId, Id, chunk, chunkType) from path-to-csv.csv' delimiters ',' csv
Run Code Online (Sandbox Code Playgroud)
这是几分钟后我得到的错误:
pg.ProgrammingError: ERROR: out of memory
DETAIL: Cannot enlarge string buffer containing 1073723635 bytes by 65536 more bytes.
CONTEXT: COPY chunksbase, line 47680536
Run Code Online (Sandbox Code Playgroud)
我认为缓冲区不能分配超过1GB,这让我觉得这可能是一个postgresql.conf问题.
这是postgresql.conf中未注释的行:
bash-3.2# cat postgresql.conf | perl -pe 's/^[ \t]*//' | grep -v '^#' | sed '/^$/d'
log_timezone = 'US/Central'
datestyle = 'iso, mdy'
timezone = 'US/Central'
lc_messages = 'en_US.UTF-8' # locale for system error message
lc_monetary = 'en_US.UTF-8' # locale for …
Run Code Online (Sandbox Code Playgroud) 有没有办法使用标准的common-lisp函数/宏将一些函数从包临时导入到当前包中?
我找不到一个,不得不自己动手.如果标准已经提供了这样的功能,我宁愿不必编写任何代码或引入另一种语言结构.
(defmacro with-functions (functions the-package &body body)
"Allows functions in the-package to be visible only for body.
Does this by creating local lexical function bindings that redirect calls
to functions defined in the-package"
`(labels
,(mapcar (lambda (x) `(,x (&rest args)
(apply (find-symbol ,(format nil "~:@(~a~)" x)
,the-package)
args)))
functions)
,@body))
Run Code Online (Sandbox Code Playgroud)
用法示例:
(defclass-default test-class ()
((a 5 "doc" )
(b 4 "doc")))
#<STANDARD-CLASS TEST-CLASS>
CL-USER>
(with-functions (class-direct-slots slot-definition-name) 'sb-mop
(with-functions (slot-definition-initform) 'sb-mop
(slot-definition-initform
(car (class-direct-slots (find-class 'test-class))))))
5
CL-USER>
Run Code Online (Sandbox Code Playgroud)
编辑:将一些Rainer的建议纳入宏. …
R中的A/B对矩阵执行逐元素划分.
但是,如果我从Matrix包中生成一个稀疏矩阵,并试图划分A/B,我会收到此错误:
> class(N)
[1] "dgCMatrix"
attr(,"package")
[1] "Matrix"
> N/N
Error in asMethod(object) :
Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 105
>
Run Code Online (Sandbox Code Playgroud)
有趣.当稀疏矩阵的总大小很小时,我得到这样的行为:
> m <- sparseMatrix(i=c(1,2,1,3), j=c(1,1,3,3), x=c(1,2,1,4))
> m/m
3 x 3 Matrix of class "dgeMatrix"
[,1] [,2] [,3]
[1,] 1 NaN 1
[2,] 1 NaN NaN
[3,] NaN NaN 1
>
Run Code Online (Sandbox Code Playgroud)
但是当它的大小适中(~20000个元素)时,我得到了Cholmod错误.
是否有一种变通方法或更合适的方法对R中的稀疏矩阵进行逐元素划分?
我正在使用相对较大的data.table
数据集并尝试分析/优化代码.我正在使用Rprof
,但我注意到在setkey操作中花费的大部分时间都没有包含在Rprof摘要中.有没有办法把这个时间花在一起?
这是一个小测试,用于显示如何在Rprof摘要中表示为数据表设置密钥的时间:
创建一个在数据表上运行配置文件setkey操作的测试函数:
testFun <- function(testTbl) {
Rprof()
setkey(testTbl, x, y, z)
Rprof(NULL)
print(summaryRprof())
}
Run Code Online (Sandbox Code Playgroud)
然后创建一个足够大的测试数据表来感受setkey操作的权重:
testTbl = data.table(x=sample(1:1e7, 1e7), y=sample(1:1e7,1e7), z=sample(1:1e7,1e7))
Run Code Online (Sandbox Code Playgroud)
然后运行代码,并将其包装在system.time操作中,以显示system.time总时间与rprof总时间之间的差异:
> system.time(testFun(testTbl))
$by.self
self.time self.pct total.time total.pct
"sort.list" 0.88 75.86 0.88 75.86
"<Anonymous>" 0.08 6.90 1.00 86.21
"regularorder1" 0.08 6.90 0.92 79.31
"radixorder1" 0.08 6.90 0.12 10.34
"is.na" 0.02 1.72 0.02 1.72
"structure" 0.02 1.72 0.02 1.72
$by.total
total.time total.pct self.time self.pct
"setkey" 1.16 100.00 0.00 0.00
"setkeyv" 1.16 100.00 0.00 0.00
"system.time" …
Run Code Online (Sandbox Code Playgroud) 假设我有一个目录A和子目录B.我进入A并启动lisp.在那个lisp进程中,我想启动一个Python子进程,其中Python将B视为其当前工作目录.lisp进程需要在A中有cwd,而python进程在B中应该有cwd.我如何以跨平台,简单的方式执行此操作?
我正在寻找一种适用于CCL和SBCL的解决方案(可能使用'运行程序功能),适用于Windows,Linux和OS X.
我查看了CCL运行程序文档,我没有看到改变已启动进程的cwd的方法.
我看了Python命令行参数,我没有看到一个会改变python进程的cwd.
我想到了'cd B'的运行程序调用; python ...',但我不确定它是如何工作的,因为它真的运行了两个程序; cd,然后是python.
Python代码作为输入(作为文件)提供,因此我无法更改任何代码(通过添加os.chdir()调用或类似代码).
将python输入文件作为子进程启动的python包装器文件并不理想,因为我正在发送stdin并监听由lisp启动的python进程的stdout.在lisp和篡改输入文件的python进程之间添加另一个子进程意味着我需要做很多stout/stdin中继,并且我觉得这会很脆弱.
krzysz00的方法非常有效.由于目录更改是在lisp中处理的,因此在启动python进程之前,此方法将用于在不同的子目录(不仅仅是python)中启动其他进程.
对于文档,这是我的代码使用krzsz00的方法,适用于SBCL和CCL.请注意,它使用Hoyte的defmacro!来自Let Over Lambda的宏,可以轻松避免不必要的变量捕获:
#+:SBCL
(defun cwd (dir)
(sb-posix:chdir dir))
(defun getcwd ()
#+SBCL (sb-unix:posix-getcwd)
#+CCL (current-directory))
(defmacro! with-cwd (dir &body body)
`(let ((,g!cwd (getcwd)))
(unwind-protect (progn
(cwd ,dir)
,@body)
(cwd ,g!cwd))))
Run Code Online (Sandbox Code Playgroud)
用法:
(with-cwd "./B"
(run-program ...))
Run Code Online (Sandbox Code Playgroud) 为什么这些形式表现如此?
CL-USER>
(setf *closures*
(loop for num in (list 1 2 3 4)
collect (lambda ()
num)))
(
#<COMPILED-LEXICAL-CLOSURE #x302004932E1F>
#<COMPILED-LEXICAL-CLOSURE #x302004932DCF>
#<COMPILED-LEXICAL-CLOSURE #x302004932D7F>
#<COMPILED-LEXICAL-CLOSURE #x302004932D2F>)
CL-USER>
(funcall (first *closures*))
4
CL-USER>
(funcall (second *closures*))
4
Run Code Online (Sandbox Code Playgroud)
我原本期望第一个funcall返回1,第二个返回2,等等.这个行为与Clozure Common Lisp和Steel-Bank Common Lisp实现一致.
如果我将循环宏重写为使用dolist的版本,我期望的是返回的内容:
(setf *closures*
(let ((out))
(dolist (item (list 1 2 3 4) (reverse out))
(push (lambda () item) out))))
(
#<COMPILED-LEXICAL-CLOSURE #x302004A12C4F>
#<COMPILED-LEXICAL-CLOSURE #x302004A12BFF>
#<COMPILED-LEXICAL-CLOSURE #x302004A12BAF>
#<COMPILED-LEXICAL-CLOSURE #x302004A12B5F>)
CL-USER>
(funcall (first *closures*))
1
CL-USER>
(funcall (second *closures*))
2
Run Code Online (Sandbox Code Playgroud)
CL-USER> …
> fread('col1,col2\n')
Empty data.table (0 rows) of 2 cols: col1,col2
> fread('col1,col2\n5,4')
col1 col2
1: 5 4
> fread('col1,col2\n5,"4\n3"')
Error in fread("col1,col2\n5,\"4\n3\"") :
Unbalanced quote (") observed on this line: 3"
>
Run Code Online (Sandbox Code Playgroud)
只要跨越多行的值包含在引号中,read.csv就可以导入此csv.
是否应该可以导入它?使用read.csv实际上对我的用例很好.我可以将结果数据帧转换为数据表.但我只是想确保没有这个功能是一个设计决定,而不是尚未测试的东西.
我有一个XML数据集,如下所示:
<protocol ID='.'>
<HEAD></HEAD>
<block ID='...'>
<HEAD></HEAD>
<trial ID='.....'>
<HEAD></HEAD>
<seq ID=''>
<HEAD></HEAD>
<calibration CLASS='affine-calibration' ID='New Calibration'>
<AX>.........</AX>
<BX>-........</BX>
<AY>.........</AY>
<BY>.........</BY>
<type>'por'</type>
</calibration>
<POR TIME='......'>
<PUPIL>.</PUPIL>
<BLINK>.</BLINK>
<V>...</V>
<H>...</H>
<PLANEINTRWV>...</PLANEINTRWV>
<PLANEINTRWH>...</PLANEINTRWH>
<PLANE>.</PLANE>
</POR>
<POR TIME='......'>
<PUPIL>.</PUPIL>
<BLINK>.</BLINK>
<V>...</V>
<H>...</H>
<PLANEINTRWV>...</PLANEINTRWV>
<PLANEINTRWH>...</PLANEINTRWH>
<PLANE>.</PLANE>
</POR>
<POR TIME='......'>
<PUPIL>.</PUPIL>
<BLINK>.</BLINK>
<V>...</V>
<H>...</H>
<PLANEINTRWV>...</PLANEINTRWV>
<PLANEINTRWH>...</PLANEINTRWH>
<PLANE>.</PLANE>
</POR>
</seq>
</trial>
<trial ID='.....'>
<HEAD></HEAD>
<seq ID=''>
<HEAD></HEAD>
<calibration CLASS='affine-calibration' ID='New Calibration'>
<AX>.........</AX>
<BX>-........</BX>
<AY>.........</AY>
<BY>.........</BY>
<type>'por'</type>
</calibration>
<POR TIME='......'>
<PUPIL>.</PUPIL>
<BLINK>.</BLINK>
<V>...</V>
<H>...</H>
<PLANEINTRWV>...</PLANEINTRWV>
<PLANEINTRWH>...</PLANEINTRWH>
<PLANE>.</PLANE> …
Run Code Online (Sandbox Code Playgroud) r ×5
common-lisp ×4
csv ×2
data.table ×2
lisp ×2
bash ×1
ccl ×1
dos ×1
fread ×1
macros ×1
postgresql ×1
python ×1
vim ×1
xml ×1