小编Gre*_*bet的帖子

Perl尽可能干净地调用具有显式附加范围的子例程引用

我希望能够写出如下内容......

call_with_scope({
    x => 47,
}, sub {
    printf "$x\n";
    printf "$y\n";
});
Run Code Online (Sandbox Code Playgroud)

其中$y在含有表达(或者词汇或动态取决于符号)的环境是约束.

我已经找到了一种方法,但它需要no strict "vars"在包含call_with_scope(...)call_with_scope使用的表达式中生效,eval以便在将控制转移到回调之前创建本地绑定.

有没有办法避免要求no strict "vars"在呼叫站点或参考和更改local变量的值而不诉诸eval?

为了完整起见,下面的代码片段实现call_with_scope并打印47然后48.

#!/usr/bin/env perl
use strict;
use warnings;

sub call_with_scope {
    my ($env, $func) = @_;
    my %property;
    my @preamble;
    foreach my $k (keys %$env) {
        $property{$k} = $env->{$k};
        # deliberately omitted: logic to ensure that ${$k} is a well-formed variable …
Run Code Online (Sandbox Code Playgroud)

perl

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

Docker为容器保留一定数量的内存

我在npmdocker容器中运行,并且由于无法分配足够的内存而经常中止。我在命令中看到一些标志--memory(例如如何使用docker设置分配给容器的资源?docker run,似乎限制了容器可以消耗的最大内存量,但是还没有看到任何可以允许我保留的内存容器的内存量,如果无法分配,则立即中止。

docker

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

如何获取 mli 文件本地的模块别名

是否可以在 mli 中为模块添加别名而不创建“必须实现的新模块”。\n这个示例非常人为,但是,例如,假设我有以下源文件\xc2\xa0int_wrapper.ml。

\n\n
type t = Int64.t\n\nlet zero = Int64.of_string "0"\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想为它定义一个接口文件,但是\xc2\xa0Int64.t\xc2\xa0很长,所以我想缩写它。

\n\n
module I = Int64\n\nval zero : int -> I.t\n
Run Code Online (Sandbox Code Playgroud)\n\n

当尝试编译模块时,我(可以预见)收到以下错误

\n\n
ocamlbuild int_wrapper.cmo\n+ ~/.opam/4.03.0/bin/ocamlc.opt -c -o int_wrapper.cmo int_wrapper.ml\nFile "int_wrapper.ml", line 1:\nError: The implementation int_wrapper.ml\n   does not match the interface int_wrapper.cmi:\n   The module `I\' is required but not provided\nCommand exited with code 2.\nCompilation unsuccessful after building 4 targets (0 cached) in 00:00:00.\nExit 10\n
Run Code Online (Sandbox Code Playgroud)\n\n

那是因为 \xc2\xa0 module I = Int64\xc2\xa0 不是别名。我实际上正在定义一个新模块,它恰好与该模块相同,Int64并且由于该模块位于签名中,因此我需要在源文件中提供一个实现。\n有没有办法在接口文件中获取真正的别名?

\n

ocaml

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

递归子程序参考

我用perl 5.8(codepad)和perl 5.16测试了下面的代码.我可能缺少一些更深层次的原则,我很好奇这种行为背后的逻辑是什么.谢谢.

以下简单的递归子例程引用

use strict;
use warnings;

my $fact = sub {
    my $n = shift;
    if ($n == 0) {
         return 1;
    }
    return $n * $fact->($n-1);
};

print $fact->(100);
Run Code Online (Sandbox Code Playgroud)

导致错误

Global symbol "$fact" requires explicit package name at line 9.
Execution aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)

在定义变量之前声明变量不会产生此错误.

use strict;
use warnings;

my $fact;
$fact = sub {
    my $n = shift;
    if ($n == 0) {
        return 1;
    }
    return $n * $fact->($n-1);
};

print $fact->(100);
Run Code Online (Sandbox Code Playgroud)

recursion perl

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

用于表示nullary数据构造函数的惯用方法

在Haskell中,如果我想要像二叉树这样的东西,我会使用代数数据类型.

data BinTree a b = EmptyBinTree | BinTree a (Maybe b) (BinTree a) (BinTree a)
Run Code Online (Sandbox Code Playgroud)

在Common Lisp中,我可能将空树表示为专用的自我评估符号:empty-bin-tree或类似的通用目标nil.我将代表二叉树的一般情况

(defun make-bin-tree
    (key-value
     &optional (left-child :empty-bin-tree)
     &optional (right-child :empty-bin-tree))
  "(list key value?) left-child? right-child? -> bin-tree"
  (list key-value left-child right-child))
Run Code Online (Sandbox Code Playgroud)

没有任何明确对应BinTree于Haskell代码中的构造函数.

是否有一种惯用的或传统的方式来表示当前包中的自我评估符号的等效的nullary数据构造函数,而不是重新使用关键字?

common-lisp

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

并发期货提交任务以非阻塞地处理池

这个问题是Python 2特有的,使用社区维护的backport concurrent.futures.

我正在尝试使用ProcessPoolExecutor(maxWorkers简单地设置为2)并行运行两个任务.这些任务都是Python函数,我希望它们中的每一个都可以在自己的进程中运行.他们不需要彼此协调(我甚至不需要知道退出状态).我只是希望能够同时启动进程并限制在任何给定时刻并行运行的进程数.

import concurrent.futures as futures
import time


def do_stuff(name):
    for x in range(10):
        print name, x
        time.sleep(1)


pool = futures.ProcessPoolExecutor(max_workers=2)
pool.submit(do_stuff("a"))
print "a submitted!"
pool.submit(do_stuff("b"))
Run Code Online (Sandbox Code Playgroud)

然而,这打印

a 0 a 1 ... a 9 a submitted! b 0 b 1 ... b 9

为什么要submit阻止操作?是否有非阻塞等效物?

这是一个使用multiprocessing具有我想要的行为的库的示例.它以非阻塞方式启动每个进程然后调用join(这可能只是一个薄的包装器waitpid(2)).但是,这种技术不能让我能够限制在任何给定时刻并行运行的进程数.

import multiprocessing
import time


def do_stuff(name):
    for x in range(10):
        print name, x
        time.sleep(1)


proc_a = multiprocessing.Process(target=do_stuff, args="a")
proc_b = multiprocessing.Process(target=do_stuff, args="b")
proc_a.start()
proc_b.start() …
Run Code Online (Sandbox Code Playgroud)

python python-2.x concurrent.futures

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

C++:如何在不定义的情况下声明非函数?

是否可以在不定义的情况下声明类似整数的东西?

在C++中,可以分离函数的定义和声明.

// foo.cpp
int foo(int);

int foo(int a) {
  return 45;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果没有功能,它似乎不是

// bar.cpp
int bar;
int bar = 10;
Run Code Online (Sandbox Code Playgroud)

bar.cpp 产生这个

$ clang++ -c bar.cpp
bar.cpp:2:5: error: redefinition of 'a'
int a = 10;
    ^
bar.cpp:1:5: note: previous definition is here
int a;
    ^
1 error generated.
Run Code Online (Sandbox Code Playgroud)

在第二个语句中省略类型注释会产生不同的错误.

// bar2.cpp
int bar;
bar = 10;
Run Code Online (Sandbox Code Playgroud)

产生

$ clang++ -c bar2.cpp 
bar2.cpp:3:1: error: C++ requires a type specifier for all declarations
bar = 10;
^
1 error generated.
Run Code Online (Sandbox Code Playgroud)

c++

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

Common Lisp为符号添加后缀以在宏中使用

如何在宏中引入带有后缀的新的,可预测命名的标识符?


所以,我正在编写一个简单的库来操作四元数.我正在使用可能有效的最简单表示,暂时使用组件列表,但我想定义一个不依赖于该表示的简单API.

在定义算法时,我想用可预测的名称(如somesymbol-realpart或)来引用四元数的每个组件somesymbol-i.

我希望能够让以下代码片段起作用.

(let
     ((my-quat '(1 2 3 4)))
  (with-quaternion my-quat
           (assert-equalp 1 my-quat-realpart)
           (assert-equalp 2 my-quat-i)
           (assert-equalp 3 my-quat-j)
           (assert-equalp 4 my-quat-k)))
Run Code Online (Sandbox Code Playgroud)

但是,我用于生成带后缀的符号的方法似乎产生了具有转义大写字符的奇怪区分大小写的符号.

(defun add-suffix-to-symbol (sym suffix)
  (intern (concatenate 'string "" (string sym) "-" suffix)))
Run Code Online (Sandbox Code Playgroud)

作为将符号转换为字符串的结果,它以大写字母打印...这是一个完全有效的规范化.但是,intern由于某些原因,通过保留案例来创建新符号,因此我必须执行以下操作来引用由引入的绑定with-quaternion.

(let
    ((my-quat '(1 2 3 4)))
  (with-quaternion my-quat
           (assert-equalp 1 |MY-QUAT-realpart|)
           (assert-equalp 2 |MY-QUAT-i|)
           (assert-equalp 3 |MY-QUAT-j|)
           (assert-equalp 4 |MY-QUAT-k|)))
Run Code Online (Sandbox Code Playgroud)

如何创建一个与旧的符号相同但带有后缀的新符号,以便它可以在宏中使用?

供参考,这里是所有代码.

(defun assert-equalp (e a)
  (assert (equalp e a)))

(defun quat-realpart (q)
  (first …
Run Code Online (Sandbox Code Playgroud)

common-lisp

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

perl按名称指定unicode字符,而不是在所有大写字母中添加名称

所以,这是一个美化点,但有一种简单的方法可以在Perl字符串中插入一个unicode字符,并命名为"normal"case?

Perl包含按名称查找代码点的unicode文字,如下所示:

"\N{GREEK SMALL LETTER ALPHA}"
Run Code Online (Sandbox Code Playgroud)

我发现以下内容更容易阅读:

  "\N{Greek Small Letter Alpha}",
Run Code Online (Sandbox Code Playgroud)

据我所知,在unicode字符名称方面没有最小的对.是否有一种简洁的方法来命名在角色不存在的情况下仍然compilation error在执行脚本的过程中很早触发的角色?

示例编译错误与故意拼写错误的字符名称,这是我不想放弃的那种检查.

$ echo '%[a]' | ./unicodify 
Unknown charname 'GREK SMALL LETTER ALPHA' at ./unicodify line 10, within string

Execution of ./unicodify aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个小实用程序,以便通过%[和分隔的助记符名称更容易在文本文件中输入unicode字符].

这是一个非常简单的例子,只是替换%[a]%[b].

#! /usr/bin/env perl

use strict;
use warnings;

use utf8;
use open ':std' => ':utf8';

my %abbrevs = (
  'a' => "\N{GREEK SMALL LETTER ALPHA}",
  'b' => "\N{GREEK SMALL LETTER …
Run Code Online (Sandbox Code Playgroud)

unicode perl

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

使用coqtop检查表达式的类型

我很好奇Coq实体的类型等同于逻辑中的连接词.为了特殊性,让我们说->/\.如果->是一个神奇的非[第一类实体],那么让我们只使用它/\作为实体.我很好奇它的域名是Prop还是Set.

是否可以使用coqtop获取表达式的类型?

我想用ghci做类似于以下的事情.

> ghci
:GHCi, version 8.6.3:  :? for help
Prelude> :t (**)
(**) :: Floating a => a -> a -> a
Run Code Online (Sandbox Code Playgroud)

coq

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