小编Nor*_*sey的帖子

是否有适合编写脚本的快速启动Haskell解释器?

有没有人知道一个快速启动的Haskell解释器适合用于编写shell脚本?使用Hugs运行'hello world'在我的旧笔记本电脑上运行了400ms,在我当前的Thinkpad X300上运行了300ms.这对于瞬时响应来说太慢了.与GHCi的时代相似.

功能语言不一定要慢:Objective Caml和Moscow ML在1ms或更短的时间内运行hello world.

澄清:我是GHC的重度用户,我知道如何使用GHCi.我知道所有关于编译以使事情变得快速的事情.解析成本应该完全无关:如果ML和OCaml的启动速度比GHCi快300倍,那么还有改进的余地.

我在寻找

  • 脚本的便利性:一个源文件,没有二进制代码,相同的代码在所有平台上运行
  • 性能可与其他解释器相媲美,包括快速启动和执行简单程序等

    module Main where
    main = print 33
    
    Run Code Online (Sandbox Code Playgroud)

不是在寻找更严肃程序的编译性能.重点是看看Haskell是否对脚本有用.

scripting performance interpreter haskell

18
推荐指数
3
解决办法
5076
查看次数

如果我不拥有该文件但对目录有写权限,如何更改Unix权限?

我正在与一位同事共享一个git存储库,并且因为git没有传播完整的Unix文件权限,所以我们有一个"挂钩",它在更新时运行,设置需要设置的"其他"权限.问题?钩子使用chmod,结果是当我的同事提交文件时,他拥有它,所以我不能chmod在它上面运行,反之亦然.这些目录都是可写的,粘性的,所以我相信我们任何一个人都有权删除任何文件,并用相同名称,相同内容但不同所有权的文件替换它.据推测,我们可以chmod做到.但这看起来像是一把非常大的锤子,而且我对它搞砸了有点怀疑.那么,有两个问题:

  1. 任何人都可以想到另一种方法吗?

  2. 如果没有,那么实施"使这个文件属于我" 的防弹 shell脚本的最佳设计是什么?没有跨文件系统移动等等......

对于那些可能没有意识到的人,写权限不授予以下权限chmod:

% ls -l value.c
-rw-rw---- 1 agallant ta105 133 Feb 10 13:37 value.c
% [ -w value.c ] && echo writeable
writeable
% chmod o+r value.c               
chmod: changing permissions of `value.c': Operation not permitted
Run Code Online (Sandbox Code Playgroud)

我们都在ta105小组中.


笔记:

  1. 我们git不仅使用协调更改,还将repo作为课程网站发布.发布网站是回购的主要目的.权限脚本使用git钩子在每次更新时运行,并确保学生无权阅读尚未公开的解决方案.

  2. 请不要暗示我有错误的umask.并非repo中的所有文件都应具有相同的权限,并且无论选择何种umask,都需要更改某些文件的权限.更不用说我对我的同事强加我的umask偏好是不礼貌的.

  3. 更新:我刚刚了解到,在我们的环境中,root被撤销到nobody我们有权访问的所有计算机上,因此依赖root权限的解决方案将无效.

unix shell file-permissions

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

静态打字的Lua

我正在寻找一个在编译时进行类型检查的Lua前端编译器,但输出标准的Lua 5.1字节代码(只有运行时类型).我想要的是一定量的静态,编译时语法分析和可选类型,以便比运行时更快地检测到琐碎的错误.生成的字节代码必须与使用标准LoadString()编译的现有Lua字节代码很好地配合.

要清楚 - 任何差异只会发生在字节编译时.在运行时,字节代码不知道在编译阶段发生了任何不同/异常的事情.

我的想法听起来很像ActionScript; 我甚至不介意输出Lua字节代码的ActionScript编译器!

有没有人听说过这样的努力?我已经看到了一些使用MetaLua来做这件事的引用,但老实说,我不够聪明,无法做出文档的尾巴.

compiler-construction lua static-typing

17
推荐指数
4
解决办法
7683
查看次数

克隆空的*bare*git存储库最简单的方法是什么?

我刚刚完成了谷歌搜索结果的巡航,其中包含所有关于git无法克隆空存储库的愚蠢行为的电子邮件.某种灵魂甚至提交了补丁.在git升级之前,克隆空的 git存储库的最简单,最直接的方法是什么?

理想的解决方案将支持为-o远程repo提供除名称以外的名称的选项origin,并且它可以作为简单的shell脚本实现,例如,git-clone-empty-repo.

(为什么我要这样做:我在我们的NetApp文件管理器上设置了一个空的,空的git repo,它将被备份,但是我想在我的本地硬盘驱动器上使用克隆并来回推拉与我合作的其他人也会这样做.我创建了很多新的git repos,我无法克隆一个空的回购让我发疯.)


编辑:VonC的线程表明

$ git-init
$ git-remote add origin server:/pub/git/test.git
Run Code Online (Sandbox Code Playgroud)

当repo为空时,相当于克隆远程仓库.这不是我想要的,因为我总是使用-ogit clone 的选项; 我根据它所使用的机器或其他一些令人难忘的标准命名远程仓库.(如果他们全部被叫,我有太多的回购,以保持他们的直线origin.)


编辑:以下答案将被标记为接受:-)

要在路径上克隆一个空的裸仓库,

  1. 保持~/git/onefile一个非裸git repo包含一个无害的文件,如.gitignore.(或者,动态创建这样的仓库.)
  2. (cd ~/git/onefile; git push 路径 master)
  3. git clone -o 名称 路径

换句话说,不要尝试克隆空仓库,而是在创建它之后,向它推送一个包含一个无害文件的简单仓库.然后它不再是空的,可以克隆.

如果有人没有打败我,我会发布一个shell脚本.

git clone git-bare

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

如何让`gcc`从标准C生成x86-64的`bts`指令?

最近一个问题的启发,我想知道是否有人知道如何在Linux x86-64平台上gcc生成x86-64 bts指令(位测试和设置),而无需借助内联汇编或非标准编译器内在函数.

相关问题:

可移植性比bts我更重要,所以我不会使用和asm指令,如果有另一个解决方案,我宁愿不使用编译器instrinsics.

编辑:C源语言不支持原子操作,所以我对获得原子测试和设置并不特别感兴趣(尽管这是测试和设置首先存在的原始原因).如果我想要一些原子,我知道我没有机会使用标准C源:它必须是内在的,库函数或内联汇编.(我在支持多线程的编译器中实现了原子操作.)

c gcc x86-64

17
推荐指数
1
解决办法
4644
查看次数

如何以编程方式快进单个git提交?

我定期从git获取看起来像这样的消息:

Your branch is behind the tracked remote branch 'local-master/master' 
by 3 commits, and can be fast-forwarded.
Run Code Online (Sandbox Code Playgroud)

我希望能够在shell脚本中编写命令,可以执行以下操作:

  1. 如何判断我当前的分支是否可以从它正在跟踪的远程分支快进?

  2. 如何判断我的分支"后面"有多少提交?

  3. 如何通过一次提交快进,以便例如,我的本地分支将从"后面的3次提交"变为"后面的2次提交"?

(对于那些感兴趣的人,我正在尝试组合一个高质量的git/darcs镜像.)

git git-pull fast-forward

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

Haskell:如何在状态monad之上编写交互式解释器?

我们正在开发一个内部使用状态monad的模型文件系统.我们有一个类型类,其操作如下:

class Monad m => FS m where
  isDirectory  :: Path -> m Bool
  children     :: Path -> m [Path]
  ...
Run Code Online (Sandbox Code Playgroud)

我们正在努力一点点交互式解释,将提供类似的命令cd,ls,cat,等等.解释器中的操作可以这样写:

fsop :: FS m => Operation -> m Response
Run Code Online (Sandbox Code Playgroud)

定义OperationResponse不重要; 如果你愿意,把它们当作弦乐.

我试图解决的问题是在I/O monad中编写一个顶层循环来解释文件系统Operation并打印响应.如果IO是FS的一个实例(也就是说,如果我们直接使用IO monad),生活会很简单:我们可以写

loop :: Path -> IO ()
loop currentDir = do
        op <- getLine
        case read op of
          ChangeDir d -> loop d -- should test 'isDirectory d', but let's not
          Ls …
Run Code Online (Sandbox Code Playgroud)

monads interpreter haskell interactive state-monad

17
推荐指数
3
解决办法
2926
查看次数

消除Haskell数组边界检查有界类型?

我正在制作许多索引类型为Bounded且索引范围为的数组(minBound, maxBound).对于这样的数组,边界检查应该是不必要的.我如何说服GHC消除边界检查?

我的特定应用程序使用盒装和非盒装不可变数组,但我对所有类型的Haskell数组感兴趣.

arrays haskell ghc bounds-check-elimination

15
推荐指数
1
解决办法
608
查看次数

应该什么时候C函数返回新分配的内存?

在其他地方的回复中,我找到了以下代码段:

一般来说,让C调用者分配内存而不是被调用者更好 - 因此在我看来strcpy是一个"更好"的函数,而不是strdup.

我可以看到这是一个有效的模式,但为什么它可以被认为更好?遵循这种模式是否有优势?或不?

最近我写了大量的代码,看起来像:

struct foo *a = foo_create();
// do something with a
foo_destroy(a);
Run Code Online (Sandbox Code Playgroud)

如果foo它不是一个扁平结构,那么我想我可以将所有初始化放在一个步骤中.另外,假设结构应该在堆上.为什么这样做会更好:

struct foo *a = malloc(sizeof(foo));
foo_init(a);
// do something with a
foo_destroy(a)
Run Code Online (Sandbox Code Playgroud)

c memory-management coding-style

14
推荐指数
4
解决办法
4439
查看次数

有没有工具来检查两个callgrind/valgrind配置文件的区别?

我试图理解程序的性能如何在使用不同选项运行时发生变化 - 我的因子为1.8我想解释一下.我一直在用[valgrind]的callgrind工具进行分析,并使用kcachegrind来显示结果.但我真的很想看看差异.我找到了该cg_diff程序,但它不能与callgrind配置文件一起使用,只能使用cachegrind配置文件,这对我来说太昂贵了. 有没有人知道用于可视化两个配置文件之间差异的工具?

linux profiling valgrind callgrind kcachegrind

14
推荐指数
1
解决办法
1745
查看次数