我想在一个c ++应用程序中嵌入Perl,并且正在寻找一种通过newXS()从perl调用c ++的方法.除了函数指针之外,我还需要一个自定义指针,指向newXS()创建的CV.指针包含C++上下文.我不想为此使用全局变量.有一个共同的方法来做到这一点?
在更广泛的范围内,问题可能是天气,有可能在newXS()创建的CV中添加闭包,以及在调用c函数时如何引用它.CvPADLIST()似乎是一个完美的地方,但是对于XSubs,当设置PERL_IMPLICIT_CONTEXT时使用它似乎是无效的(在perl的pad.c开头注释.它可以被忽略吗?).还有其他地方我可以放置CV本地数据吗?
如果我有Grammar a并定义了Grammar b一个块 '{ ... }' 的语法为Grammar a,是否有可能以某种方式将这些语法链接在一起?即Grammar a是Tcl,Grammar b嵌入C。从Perl6 语法切换到Regex 语法时,乐堂是如何做到这一点的?
假设我在一个目录中有 2 个文件
p.pl
Mod.pm
Run Code Online (Sandbox Code Playgroud)
在 perl5 中,我可以通过以下方式从 p.pl 加载模块 Mod.pm:
use FindBin qw($Bin);
use lib "$Bin";
...
use Mod;
Run Code Online (Sandbox Code Playgroud)
我想知道Raku等价物是什么(如果文件是 p.raku 和 Mod.rakumod)?
我想要完成的是加载一个相对于脚本的模块。
cd d0; rakudo d1/p.raku以及cd d1; rakudo p.raku我试图弄清楚如何实现 Lisp 评估 非递归。我的基于 C 的评估器是Minimal Lisp文件 l1.c。然而,其中的几个函数再次递归为 eval:eval、apply、evargs、evlist 以及 Lisp Ops DefineFunc、whileFunc、setqFunc、ifFunc...
我正在尝试找出一个平坦的评估。我可以想出一些可能的方法:
我的问题是:是否有算法/论文/实现以不同的方式进行平面评估。我正在寻找一种不转换为字节码但类似于使用下推堆栈的无递归“深度优先遍历”的实现。我想对原始的 s 表达式进行操作。
答案:在 C 语言中实现求值器时,您需要在平面循环中实现整个过程,手动实现返回堆栈和堆栈帧,使用 goto 和 switch() 对控制流进行建模。这是一个例子:flat。
我正试图在浮动中扫描:13.8518009935297.第一个例程是我自己的,第二个是MacOSX libc的strtod,第三个是GMP的mpf_get_d(),第四个是perls numeric.c:Perl_my_atof2().
我用这个片段打印尾数:
union ieee_double {
struct {
uint32_t fracl;
uint32_t frach:20;
uint32_t exp:11;
uint32_t sign:1;
} s;
double d;
uint64_t l;
};
union ieee_double l0;
l0.d = ....
printf("... 0x%x 0x%x\n", l0.s.frach, l0.s.fracl);
Run Code Online (Sandbox Code Playgroud)
这四个函数的返回值是:
my-func : 0xbb41f 0x4283d21b
strtod : 0xbb41f 0x4283d21c
GMP : 0xbb41f 0x4283d21b
perl : 0xbb41f 0x4283d232
Run Code Online (Sandbox Code Playgroud)
前三个函数之间的差异是四舍五入.但是perl的尾数完全不同步.
如果我再次将所有四个双打打印到一个字符串,我得到相同的十进制双回,数字似乎相等.
我的问题:my-func,strtod,GMP之间的区别在于四舍五入.但是,为什么perl的尾数太多不同步,但如果转换回十进制,它最终会再次变为相同的数字.差异是22,所以应该用小数表示.我怎么解释这个?
追加: 对不起,我想我发现了问题:
$r = rand(25);
$t = $p->tokenize_str("$r");
Run Code Online (Sandbox Code Playgroud)
tokenize_str()是我从string到double的转换实现.但是perl stringify"$ r"打印出$ r为13.8518009935297,这已经是截断了.$ r的实际值是不同的,所以当我最后使用$ r的$ t的二进制文件时,我会得到不同的值.
是否可以读取/访问 zfs 数据集的校验和?我想访问它以验证它在靴子之间没有改变。阅读https://en.wikipedia.org/wiki/ZFS#ZFS_data_integrity:是否可以从用户空间访问像 zfs 中的校验和方案一样的 Merkle 树的最高校验和?
我试图了解Rust宏如何捕获工作,并正在查看nom解析器库。
位置nom / src / bytes.rs声明tag!使用捕获的宏($i:expr, $tag: expr)。但是,在使用的所有地方,tag!它仅使用一个参数,即tag!("+")。例如:NOM-lua52 / op.rs。我已经阅读了有关宏的教程,但是这种结构似乎很特殊。
似乎输入$i是某种隐式的?
我想弄清楚如何在 Raku 中重写 NQP 的优先级解析器:
Precedence Parser 在这里实现:https : //github.com/Raku/nqp/blob/master/src/HLL/Grammar.nqp#L384 NQP 应该是 Raku 的一个子集,但语法部分似乎是专门的。
如果我想改写 Raku 中 EXPR() 中的 Precedence Parser,那么要使用的 Raku 语法原语是什么?即会cursor_start_cur()翻译成什么?有没有cursor在乐语法?如何设置posRaku Match 对象?会$termcur.MATCH()翻译成什么 等等...
我不是在寻找编写优先解析器的不同方法,而是想知道它是否可以像 NQP 那样在 Raku 中完成。
我目前正在使用alt++ctrl和++在工作区之间循环left:altctrlright
...
, ((altModMask .|. controlMask, xK_Left),
prevWS)
, ((altModMask .|. controlMask, xK_Right),
nextWS)
Run Code Online (Sandbox Code Playgroud)
这对于单显示器设置来说效果很好。然而,使用双显示器设置时有点令人困惑。这是因为如果当前在另一个屏幕上可见,则要显示的工作区将更改屏幕。例如,如果我在屏幕 0 上有 ws 1,在屏幕 1 上有 ws 2,并且焦点在屏幕 0 上:
1:term (2:web) 3:txt
Run Code Online (Sandbox Code Playgroud)
当我现在执行 a nextWS, ws 2 时,当前在屏幕 1 上的内容将被绘制到屏幕 0,而屏幕 1 将显示 ws 1。
(1:term) 2:web 3:txt
Run Code Online (Sandbox Code Playgroud)
我想要的是一种行为,其中prexWS和nextWS将跳过当前显示在另一台显示器上的工作区,并仅选择当前未显示的工作区。
是否已经存在这样的命令或者是否有一些xmonad.hs实现此命令的示例?
我想打电话
m(int argv, char **argc)
Run Code Online (Sandbox Code Playgroud)
从 Lua 内部使用 Swig 生成的包装器。有谁知道如何做到这一点?在调用 m() 之前,如何告诉 Swig 从 Lua 数据生成“char **”?——康拉德
是否有透明的std::unique_ptr容器使用方式?
#include <iostream>
#include <memory>
#include <map>
struct method {
virtual ~method() { std::cout << "f\n"; };
};
typedef std::unique_ptr<method> MPTR;
std::map<int, MPTR> tbl;
void insert(int id, method *m) {
tbl.insert({id,std::unique_ptr<method>(m)});
};
void set(int id, method *m) {
tbl[id] = std::unique_ptr<method>(m);
};
int main(int argc, char **argv) {
insert(1,new method());
set(1,new method());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想使用tbl.insert({id,m});和tbl[id] = m;等,而不必为每次访问包装/解包.
std::map.我来了一个模板代码,用于*模板类型之后:
...
template <typename _Up, typename _Ep, typename = void>
struct _Ptr
{
using type = _Up*;
};
...
Run Code Online (Sandbox Code Playgroud)
我看到的另一种用法
...
template <typename T, typename \
std::enable_if<std::is_integral<T>::value,T>::type* = nullptr>
...
Run Code Online (Sandbox Code Playgroud)
这个结构描述在哪里?