小编Gre*_*bet的帖子

Lisp单元测试宏约定和最佳实践

我发现很难推断宏观扩张,并且想知道测试它们的最佳实践是什么.

所以如果我有一个宏,我可以通过执行一个级别的宏扩展macroexpand-1.

(defmacro incf-twice (n)
  `(progn
     (incf ,n)
     (incf ,n)))
Run Code Online (Sandbox Code Playgroud)

例如

(macroexpand-1 '(incf-twice n))
Run Code Online (Sandbox Code Playgroud)

评估为

(PROGN (INCF N) (INCF N))
Run Code Online (Sandbox Code Playgroud)

将它变成对宏的测试似乎很简单.

(equalp (macroexpand-1 '(incf-twice n))
  '(progn (incf n) (incf n)))
Run Code Online (Sandbox Code Playgroud)

是否有用于组织宏测试的既定惯例?还有,是否有一个库来总结s表达式之间的差异?

lisp macros unit-testing common-lisp

13
推荐指数
2
解决办法
205
查看次数

for循环不会修改`my`变量,但会修改`my`变量

在Perl 5.20中,for循环似乎能够修改模块范围的变量,但不能修改父范围中的词法变量.

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

our $x;

sub print_func {
    print "$x\n";
}

for $x (1 .. 10) {
    print_func; 
}
Run Code Online (Sandbox Code Playgroud)

像您期望的那样打印1到10,但以下不是:

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

my $x;

sub print_func {
    print "$x\n";
}

for $x (1 .. 10) {
    print_func; 
}
Run Code Online (Sandbox Code Playgroud)

发出以下警告10次:

Use of uninitialized value $x in concatenation (.) or string at perl-scoping.pl line 8.
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?我知道perl子例程不能嵌套(并且始终具有模块范围),因此它们无法关闭my变量似乎是合乎逻辑的.在这种情况下,perl in strictmode应该使用如下消息拒绝第二个程序:

Global symbol "$x" requires explicit package name at perl-scoping.pl line 6.
Global …
Run Code Online (Sandbox Code Playgroud)

perl

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

OCaml ctypes处理参数的惯用方法

我正在为一些使用out-parameter idiom并返回错误代码的C函数编写OCaml包装器.我一直在使用OCaml端分配C数组来包装它们Ctypes.allocate_n.然后将内容复制到OCaml类型中.

我觉得我正在解决一个问题,Ctypes或者其他一些模块已经以另一种方式解决了,这是一个例子.

gethostname(2) 有以下类型:

int gethostname(char *name, size_t len);
Run Code Online (Sandbox Code Playgroud)

这是out_parameter.mli包装gethostname功能.

val gethostname : int -> [> `Ok of string | `Error of int];;
Run Code Online (Sandbox Code Playgroud)

这是实施

open Core.Std;;
let (@->) = Ctypes.(@->);;
let returning = Ctypes.returning;;
open Foreign;;

let gethostname size =
  let size' = Unsigned.Size_t.of_int size in
  let c_gethostname =
    foreign "gethostname" (Ctypes.ptr Ctypes.char @-> Ctypes.size_t @-> returning Ctypes.int) in
  let buf = Ctypes.allocate_n Ctypes.char ~count:size in
  let err = c_gethostname buf …
Run Code Online (Sandbox Code Playgroud)

ocaml

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

OCaml'下划线类型'(例如'_a)是否会引入运行时类型错误/健全性违规的可能性?

我正在阅读有关标准ML中的值限制的一些内容,并尝试将示例转换为OCaml以查看它将执行的操作.似乎OCaml在上下文中产生这些类型,其中SML由于值限制而拒绝程序.我也在其他上下文中看到过它们,比如空哈希表尚未"特化"到特定类型.

http://mlton.org/ValueRestriction

以下是SML中被拒绝程序的示例:

val r: 'a option ref = ref NONE
val r1: string option ref = r
val r2: int option ref = r
val () = r1 := SOME "foo"
val v: int = valOf (!r2)
Run Code Online (Sandbox Code Playgroud)

如果您逐字输入新泽西州的SML的第一行,则会收到以下错误:

- val r: 'a option ref = ref NONE;
stdIn:1.6-1.33 Error: explicit type variable cannot be generalized at its binding declaration: 'a
Run Code Online (Sandbox Code Playgroud)

如果您不使用显式类型注释

- val r = ref NONE

stdIn:1.6-1.18 Warning: type vars not generalized because of
   value restriction are instantiated …
Run Code Online (Sandbox Code Playgroud)

ocaml sml

11
推荐指数
3
解决办法
810
查看次数

Golang检查字符串是否为有效路径

Golang文件路径模块(https://golang.org/pkg/path/filepath/)包含一些用于操作路径的函数,os.Stat可用于检查文件是否存在.有没有办法检查一个字符串是否真的形成一个有效的路径(无论该路径上是否有文件)?

go

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

Perl如何避免shebang循环?

perl解释了shebang本身并模仿了它的行为exec*(2).我认为它模仿了Linux在所有空白上分裂的行为,而不是BSD第一个只有空白的东西,但是没关系.

就像快速演示一样 really_python.pl

#!/usr/bin/env python

# the following line is correct Python but not correct Perl
from collections import namedtuple
print "hi"
Run Code Online (Sandbox Code Playgroud)

调用时打印为hi perl really_python.pl.

此外,下面的程序将做正确的事情,而不管它们是否被援引为perl program./program.

#!/usr/bin/perl
print "hi\n";
Run Code Online (Sandbox Code Playgroud)

#!/usr/bin/env perl
print "hi\n";
Run Code Online (Sandbox Code Playgroud)

我不明白为什么程序不是无限循环.在上述任何一种情况下,shebang线都是或解析为perl解释器的绝对路径.似乎接下来应该发生的事情是perl解析文件,注意到shebang,并委托shebang路径(在这种情况下本身).是否perl比较家当路径自身的ARGV[0]?不perl看家当字符串,看看它是否包含"perl"一个子?

我试图使用符号链接来触发我期待的无限循环行为.

$ ln -s /usr/bin/perl /tmp/p

#!/tmp/p
print "hi\n";
Run Code Online (Sandbox Code Playgroud)

但该程序打印"hi",无论它是如何被调用的.

然而,在OS X上,我能够perl使用脚本欺骗无限的shebang循环.

的内容 /tmp/pscript

#!/bin/sh
perl "$@"
Run Code Online (Sandbox Code Playgroud)

perl脚本的内容

#!/tmp/pscript
print "hi\n";
Run Code Online (Sandbox Code Playgroud)

这确实是无限循环(在OS …

perl

10
推荐指数
2
解决办法
392
查看次数

测试::更多is_deeply在与字符串进行比较时不会打印数组/ hashrefs

当Test :: More将arrayrefs和hashrefs相互比较时,相应的诊断消息确实提供了信息,并显示了结构不同的第一个索引,无论嵌套深度如何.但是,当它将arrayref或hashref与简单标量进行比较时,它会在诊断消息中生成一个字符串化的标量(带有内存地址和引用类型),这很难解释.

有没有办法以自定义方式(例如使用Data :: Dumper)将Test :: More配置为漂亮打印数组或hashrefs?

这是一个包含两个测试用例的示例.第一部分让您深入了解程序中存在的内容,但却出乎意料.第二个通知用户字符串和arrayref之间的类型不匹配,但不打印arrayref中的任何项目.

#!/usr/bin/env perl
use strict;
use warnings;
use Test::More tests => 2;

is_deeply(
    {
        a => [5],
    },
    {
        a => [5, 6, 8],
    },
    'compare two hashrefs structurally (very informative output)',
);

is_deeply(
    [5, 6, 8],
    "",
    'compare two "incompatible" values structurally (uninformative output)',
);
Run Code Online (Sandbox Code Playgroud)

而TAP输出:

1..2
not ok 1 - compare two hashrefs structurally (very informative output)
#   Failed test 'compare two hashrefs structurally (very informative output)'
#   at test-more-failure.pl …
Run Code Online (Sandbox Code Playgroud)

perl unit-testing tap

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

方法调用不提供标量上下文......看起来很奇怪

此行为不是Math :: BigInt特定的,但以下代码在最后一行中断.

use strict;
use warnings;
use Math::BigInt;

my $a = Math::BigInt->bone;
my $b = Math::BigInt->bone;

print ($a+$b)->bfac;
Run Code Online (Sandbox Code Playgroud)

但是,此代码可以正常工作:

use strict;
use warnings;
use Math::BigInt;

my $a = Math::BigInt->bone;
my $b = Math::BigInt->bone;

print scalar($a+$b)->bfac;
Run Code Online (Sandbox Code Playgroud)

我的问题是这个......为什么标题上下文不是自动强加在左边的" - >"参数上?AFAIK," - >"仅适用于标量和(在格式上)类型上的标量.

perl

8
推荐指数
2
解决办法
107
查看次数

OCaml 如何修复模块名称冲突

制作顶层时,模块名称不允许与内部编译器库冲突。

修复此类模块名称冲突的策略有哪些?

理想情况下,是否可以传递一些参数来ocamlc指示它“破坏”所有模块的名称以使用像 这样的自定义前缀MyProject_?(从 OCaml ABI 的角度来看,并不是字面上改变源文件)

完整示例如下:

Sqrt.ml包含

let sqrt x = x ** 0.5
Run Code Online (Sandbox Code Playgroud)

Sqrt.mli包含

val sqrt : float -> float
Run Code Online (Sandbox Code Playgroud)

mktop包含

#!/bin/bash

ocamlc -c Sqrt.mli -o Sqrt.cmi 
ocamlc -c Sqrt.ml  -o Sqrt.cmo

ocamlmktop -o sqrt_toplevel Sqrt.cmo
Run Code Online (Sandbox Code Playgroud)

我可以生成一个包含我想要的函数的顶层。

% ./sqrt_toplevel
        OCaml version 4.04.0

# Sqrt.sqrt 4.5;;
- : float = 2.12132034355964239
Run Code Online (Sandbox Code Playgroud)

如果我通过更改文件名将Sqrt模块重命名为Parse,则该名称与内部库冲突,并且顶层无法链接。

mktop就是现在

#!/bin/bash

ocamlc -c Parse.mli -o Parse.cmi 
ocamlc -c Parse.ml  -o Parse.cmo

ocamlmktop -o …
Run Code Online (Sandbox Code Playgroud)

ocaml namespaces

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

Perl是否指定pos触发副本?

分配给pos字符串计数为"写入",触发副本?(在OS X上使用perl 5.26测试)

我正在写一个小的lexing实用程序.经常出现的一件事是搜索从给定偏移量开始的模式...并返回匹配的字符串(如果有的话).

为了支持反复尝试使用令牌,我需要我的功能,pos如果我们成功的话,将匹配设置在匹配之后,如果不是,我需要设置到我们开始搜索的地方.

例如

my $string = "abc";
consume($string, qr/b/, 1);
printf "%s\n", pos($string); # should print 2

pos($string) = 0; # reset the pos, just to demonstrate
                  # the intended behavior when there isn't a match

consume($string, qr/z/, 1);
printf "%s\n", pos($string); # should print 1
Run Code Online (Sandbox Code Playgroud)

这是一个返回正确的东西但没有正确设置pos的实现.

package TokenConsume;
use strict;
use warnings;

use Exporter qw[import];
our @EXPORT_OK = qw[consume];

sub consume {
    my ($str, $pat, $pos) = @_;
    pos($str) = …
Run Code Online (Sandbox Code Playgroud)

perl

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

标签 统计

perl ×5

ocaml ×3

unit-testing ×2

common-lisp ×1

go ×1

lisp ×1

macros ×1

namespaces ×1

sml ×1

tap ×1