小编Cla*_*ley的帖子

在Common Lisp中为vim自定义自动格式化/自动缩进的最佳方法

我想知道在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关键字定义为宏.这似乎在大多数时候"做正确的事",但我使用的宏仍然没有正确自动格式化.虽然我会说这更像是宏写法(非标准语言扩展)的问题,而不是其他任何问题.

所以,对于大多数情况,这个解决方案对我来说效果很好,而且我不需要编码(和维护)任何东西.好东西!

lisp vim common-lisp

6
推荐指数
2
解决办法
2718
查看次数

R:根据数据计数生成直方图

假设我有矢量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和朋友来说太大了.

r

6
推荐指数
2
解决办法
1909
查看次数

PostgreSQL将大型csv文件加载到表中时出现问题

在我的设置中,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)

csv postgresql

6
推荐指数
1
解决办法
7066
查看次数

Common Lisp:从包中临时导入一些函数的最佳方法

有没有办法使用标准的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的建议纳入宏. …

lisp macros common-lisp

5
推荐指数
1
解决办法
552
查看次数

R中稀疏矩阵的向量化元素划分

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中的稀疏矩阵进行逐元素划分?

r vectorization sparse-matrix

5
推荐指数
1
解决办法
2452
查看次数

使用Rprof分析data.table的setkey操作

我正在使用相对较大的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)

r data.table

5
推荐指数
1
解决办法
415
查看次数

Common Lisp:使用与lisp进程不同的工作目录启动子进程

假设我有一个目录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)

python bash dos common-lisp ccl

4
推荐指数
1
解决办法
1614
查看次数

循环宏和闭包的意外行为

为什么这些形式表现如此?

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> …

common-lisp

4
推荐指数
1
解决办法
240
查看次数

fread和引用的多行列值

> 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实际上对我的用例很好.我可以将结果数据帧转换为数据表.但我只是想确保没有这个功能是一个设计决定,而不是尚未测试的东西.

csv r fread data.table

4
推荐指数
1
解决办法
1328
查看次数

在R中提取XML节点和属性

我有一个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)

xml r

3
推荐指数
1
解决办法
1万
查看次数

标签 统计

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

sparse-matrix ×1

vectorization ×1

vim ×1

xml ×1