我发现很难推断宏观扩张,并且想知道测试它们的最佳实践是什么.
所以如果我有一个宏,我可以通过执行一个级别的宏扩展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表达式之间的差异?
在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 strict
mode应该使用如下消息拒绝第二个程序:
Global symbol "$x" requires explicit package name at perl-scoping.pl line 6.
Global …
Run Code Online (Sandbox Code Playgroud) 我正在为一些使用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) 我正在阅读有关标准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) Golang文件路径模块(https://golang.org/pkg/path/filepath/)包含一些用于操作路径的函数,os.Stat
可用于检查文件是否存在.有没有办法检查一个字符串是否真的形成一个有效的路径(无论该路径上是否有文件)?
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 …
当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) 此行为不是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," - >"仅适用于标量和(在格式上)类型上的标量.
制作顶层时,模块名称不允许与内部编译器库冲突。
修复此类模块名称冲突的策略有哪些?
理想情况下,是否可以传递一些参数来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) 分配给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 ×5
ocaml ×3
unit-testing ×2
common-lisp ×1
go ×1
lisp ×1
macros ×1
namespaces ×1
sml ×1
tap ×1