小编Wan*_*ang的帖子

如何让vim的visualbell只闪现顶部/底部线条?

Vim多年来一直在使用,这一次我只是接受了bright and distracting the visual bell.最近有人给我看了Emacs visual bell,它只闪现了屏幕的顶部和底部线条.有谁知道如何在Vim中重现这种行为?

如果它目前不可配置,有人知道修补它有多难吗?我有一些C经验,但不熟悉codebase.

vim

32
推荐指数
1
解决办法
1371
查看次数

良好的类型系统可以区分不同基础的矩阵吗?

我的程序(Hartree-Fock /迭代SCF)有两个矩阵F和F',它们实际上是用两个不同的基数表示的相同矩阵.我只是失去了三个小时的调试时间,因为我不小心使用F'代替F.在C++中,类型检查器没有捕获这种错误,因为两个变量都是Eigen::Matrix<double, 2, 2>对象.

我想知道,对于Haskell/ML /等.人们,无论你是否正在编写这个程序,你都会构建一个F和F'有不同类型的类型系统?那会是什么样的?我基本上试图了解如何将一些逻辑错误外包给类型检查器.

编辑:矩阵的基础就像单位.你可以说1L或多加仑,它们都意味着同样的事情.或者,为了给出一个矢量示例,可以在笛卡尔坐标中说(0,1)或在极坐标中说(1,pi/2).但即使含义相同,数值也不同.

编辑:也许单位是错误的比喻.我不是在寻找某种记录类型,我可以指定第一个字段是升和第二个加仑,而是说这个矩阵作为一个整体,用一些其他矩阵来定义(基础),其中基础可以是任何相同维度的矩阵.例如,构造函数看起来像是mkMatrix [[1, 2], [3, 4]] [[5, 6], [7, 8]],然后将该对象添加到另一个矩阵只有当两个对象具有与其第二个参数相同的矩阵时才进行类型检查.那有意义吗?

编辑:维基百科上的定义,工作示例

ocaml haskell types type-systems sml

29
推荐指数
5
解决办法
1954
查看次数

用于在shell脚本中返回多个值的习惯用法

是否有任何习惯用于从脚本中的bash函数返回多个值?

http://tldp.org/LDP/abs/html/assortedtips.html描述了如何回显多个值并处理结果(例如,示例35-17),但如果某些返回值是带空格的字符串,则会变得棘手在.

一种更有条理的返回方式是分配给全局变量,比如

foo () {
    FOO_RV1="bob"
    FOO_RV2="bill"
}

foo
echo "foo returned ${FOO_RV1} and ${FOO_RV2}"
Run Code Online (Sandbox Code Playgroud)

我意识到,如果我需要在shell脚本中重新入门,我可能做错了,但我仍然感到非常不舒服地抛出全局变量只是为了保持返回值.

有没有更好的办法?我更喜欢可移植性,但如果必须指定的话,它可能不是真正的限制#!/bin/bash.

shell idioms

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

输入为千兆/太字节大小时会发生什么变化?

今天,当我看到一个数据集,其中最小的文件是48000个字段乘1600行(几个人的单倍型,22号染色体)时,我今天刚刚迈出了我的第一个宝贝步骤进入真正的科学计算.这被认为是微不足道的.

我写Python,所以我花了最后几个小时阅读有关HDF5,Numpy和PyTable的内容,但我仍然觉得我并不是真正想要一个TB级数据集对于我作为程序员的实际意义.

例如,有人指出,对于较大的数据集,不可能将整个内容读入内存,不是因为机器内存不足,而是因为架构的地址空间不足!它让我大吃一惊.

还有什么其他的假设我一直在教室里依赖这个大的投入?我需要做些什么才能开始做或以不同的方式思考?(这不一定是Python特定的.)

python large-data-volumes scientific-computing

21
推荐指数
2
解决办法
1699
查看次数

OCaml调用约定:这是一个准确的摘要吗?

我一直在尝试找到OCaml调用约定,以便我可以手动解释gdb无法解析的堆栈跟踪.不幸的是,除了一般观察之外,似乎没有任何东西用英文写下来.例如,人们会在博客上评论OCaml在寄存器中传递了许多参数.(如果某处有英文文档,我们非常感谢链接.)

所以我一直试图从ocamlopt源码中解开它.任何人都可以确认这些猜测的准确性吗?

并且,如果我对在寄存器中传递的前十个参数是对的,那么通常不可能将参数恢复到函数调用吗?在C中,如果只是向后走到正确的帧,参数仍会被推到堆栈的某个地方.在OCaml中,似乎被调用者可以自由地破坏他们的呼叫者的论点.


注册分配(来自/asmcomp/amd64/proc.ml)

为了调用OCaml函数,

  • 前10个整数和指针参数在寄存器rax,rbx,rdi,rsi,rdx,rcx,r8,r9,r10和r11中传递
  • 前10个浮点参数在寄存器xmm0 - xmm9中传递
  • 其他参数被压入堆栈(最左边的第一个?),浮点数和整数和指针混合在一起
  • 陷阱指针(参见下面的例外)在r14中传递
  • 在r15中传递分配指针(可能是本博客文章中描述的次要堆)
  • 如果返回值是整数或指针,则返回值在rax中传递;如果是float,则返回xmm0
  • 所有寄存器都是来电保存?

要调用C函数,使用标准的amd64 C约定:

  • 前六个整数和指针参数在rdi,rsi,rdx,rcs,r8和r9中传递
  • 前8个浮点参数在xmm0 - xmm7中传递
  • 其他参数被压入堆栈
  • 返回值以rax或xmm0传回
  • 寄存器rbx,rbp和r12-r15是被调用者保存的

退货地址(自/asmcomp/amd64/emit.mlp)

返回地址是按照amd64 C约定推入调用帧的第一个指针.(我猜这个ret指令假定这个布局.)

例外(来自/asmcomp/linearize.ml)

代码try (...body...) with (...handler...); (...rest...)线性化如下:

Lsetuptrap .body
(...handler...)
Lbranch .join
Llabel .body
Lpushtrap
(...body...)
Lpoptrap
Llabel .join
(...rest...)
Run Code Online (Sandbox Code Playgroud)

然后像这样发出组件(右边的目的地):

call .body
(...handler...)
jmp .join
.body:
pushq %r14
movq %rsp, %r14
(...body...)
popq %r14
addq %rsp, 8 …
Run Code Online (Sandbox Code Playgroud)

ocaml

20
推荐指数
1
解决办法
939
查看次数

用于学习惯用的Haskell(eta约简,符号中缀运算符,库等)的资源

尽管有一些Lisp和ML的经验,但我在学习阅读和(惯用)编写Haskell时遇到了很多麻烦,因为本地风格似乎是

  • 尽可能做到消除
  • 避免使用括号来支持运算符优先级
  • 将一半的逻辑打包到超载的非字母数字中缀运算符的桶中

最后一个特别困难,因为有很多预定义的运算符,每个运算符都有自己的约定和一般语义,经常阅读Haskell成为Hoogle和:type.

是否有任何好的教程假设CS /功能概念的知识,而是专注于Haskell特定的习语?我正在寻找类似Real-World Haskell的东西,它以一个非常幼稚,明确的程序开始,然后逐渐将其转换为更惯用的风格,介绍和解释成语.但是它不是引入和解释像monad和类类这样的一般概念,而是引入特定的monad和特定的类型类,比如"但这正是Alternative monoid所做的!"

haskell idioms

19
推荐指数
2
解决办法
3033
查看次数

减少或显式递归?

我最近开始和朋友一起阅读Paul Graham的On Lisp,我们意识到我们对reduce有不同的看法:我认为它非常清晰简洁地表达了某种递归形式; 他更喜欢非常明确地写出递归.

我怀疑我们在某些情况下是正确的而在另一种情况下是错误的,但我们不知道这条线在哪里.你何时选择一种形式而不是另一种形式,在做出这种选择时你会怎么想?

为了清楚我对reduce和显式递归的意思,这里实现了两次相同的函数:

(defun my-remove-if (pred lst)
    (fold (lambda (left right)
                  (if (funcall pred left) 
                      right 
                      (cons left right)))
          lst :from-end t))

(defun my-remove-if (pred lst)
    (if lst
        (if (funcall pred (car lst))
            (my-remove-if pred (cdr lst))
            (cons (car lst) (my-remove-if pred (cdr lst))))
        '()))
Run Code Online (Sandbox Code Playgroud)

我害怕我开始使用Schemer(现在我们是Racketeers?)所以如果我搞砸了Common Lisp语法,请告诉我.希望即使代码不正确,这一点也很明确.

lisp coding-style

12
推荐指数
1
解决办法
1058
查看次数

检查大量返回值时的好c风格

有时我必须编写代码,在执行操作和检查错误条件之间交替(例如,调用库函数,检查其返回值,继续).这通常导致长期运行,其中实际工作发生在if语句的条件下,例如

if(! (data = (big_struct *) malloc(sizeof(*data)))){
    //report allocation error
} else if(init_big_struct(data)){
    //handle initialization error
} else ...
Run Code Online (Sandbox Code Playgroud)

你们是怎么写这种代码的?我检查了一些样式指南,但他们似乎更关心变量命名和空格.

风格指南的链接欢迎.

编辑:如果不清楚,我不满意这种风格的易读性,并寻找更好的东西.

c coding-style

11
推荐指数
2
解决办法
921
查看次数

从Python列表中获取n个项目组的惯用方法?

给出一个清单

A = [1 2 3 4 5 6]
Run Code Online (Sandbox Code Playgroud)

是否有任何惯用(Pythonic)方式迭代它就好像它一样

B = [(1, 2) (3, 4) (5, 6)]
Run Code Online (Sandbox Code Playgroud)

索引除外?感觉就像C的延续:

for a1,a2 in [ (A[i], A[i+1]) for i in range(0, len(A), 2) ]:
Run Code Online (Sandbox Code Playgroud)

我不禁觉得应该有一些聪明的黑客使用itertools或切片或其他东西.

(当然,一次两个只是一个例子;我想要一个适用于任何n的解决方案.)

编辑:在Python中一次迭代字符串2(或n)个字符,但即使是最干净的解决方案(使用zip接受)也不能很好地推广到更高的n而没有列表理解和*-notation.

python iteration

9
推荐指数
1
解决办法
4447
查看次数

优雅的方式来测试python ASTs的相等性(不是引用或对象标识)

不知道这里的术语,但是这将是区别eq?equal?的差额,方案,或者==strncmp与C字符串; 在每种情况下,第一个将返回false为两个不同的字符串,实际上具有相同的内容,第二个将返回true.

对于Python的AST,我正在寻找后一种操作.

现在,我这样做:

import ast
def AST_eq(a, b):
    return ast.dump(a) == ast.dump(b)
Run Code Online (Sandbox Code Playgroud)

这看起来很有效,但感觉就像是等待发生的灾难.谁知道更好的方法?

编辑:不幸的是,当我去比较两个AST时__dict__,这个比较默认使用单个元素的__eq__方法.AST被实现为其他AST的树,并且它们__eq__显然检查参考标识.因此,无论是直接==还是托马斯链接的解决方案.(除此之外,我也不想将每个AST节点类型子类化以插入此自定义__eq__.)

python equality abstract-syntax-tree

8
推荐指数
3
解决办法
1642
查看次数