小编Kon*_*ele的帖子

Perl newXS()添加了闭包

我想在一个c ++应用程序中嵌入Perl,并且正在寻找一种通过newXS()从perl调用c ++的方法.除了函数指针之外,我还需要一个自定义指针,指向newXS()创建的CV.指针包含C++上下文.我不想为此使用全局变量.有一个共同的方法来做到这一点?

在更广泛的范围内,问题可能是天气,有可能在newXS()创建的CV中添加闭包,以及在调用c函数时如何引用它.CvPADLIST()似乎是一个完美的地方,但是对于XSubs,当设置PERL_IMPLICIT_CONTEXT时使用它似乎是无效的(在perl的pad.c开头注释.它可以被忽略吗?).还有其他地方我可以放置CV本地数据吗?

c++ perl xs

7
推荐指数
2
解决办法
159
查看次数

是否可以在语法 nqp 中运行子语法?

如果我有Grammar a并定义了Grammar b一个块 '{ ... }' 的语法为Grammar a,是否有可能以某种方式将这些语法链接在一起?即Grammar a是Tcl,Grammar b嵌入C。从Perl6 语法切换到Regex 语法时,乐堂是如何做到这一点的?

regex raku nqp

6
推荐指数
2
解决办法
96
查看次数

如何使用与 FindBin 等效的 Raku 加载与 Raku 中的脚本相关的模块

假设我在一个目录中有 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)?

我想要完成的是加载一个相对于脚本的模块。

  • 我想在启动脚本之前不设置 env 变量的情况下执行。
  • 我不想用 zef 安装模块。
  • 我不想被强制设置CWD到scripts目录,这意味着如果p.raku和Mod.rakumod在目录D1是反过来目录D0我希望能够运行cd d0; rakudo d1/p.raku以及cd d1; rakudo p.raku

module raku

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

Lisp s 表达式的平面求值

我试图弄清楚如何实现 Lisp 评估 非递归。我的基于 C 的评估器是Minimal Lisp文件 l1.c。然而,其中的几个函数再次递归为 eval:eval、apply、evargs、evlist 以及 Lisp Ops DefineFunc、whileFunc、setqFunc、ifFunc...

我正在尝试找出一个平坦的评估。我可以想出一些可能的方法:

  1. 转换为字节码并在VM中执行
  2. 实现一个扁平的 Forth 求值器并在 Forth 中实现 Lisp 求值,这就是lf.f所做的事情。
  3. 另一种可能性可能是将 l1.c 中的所有递归函数加入到一个大 switch 循环中。局部变量将被连接到基于堆的结构中,对递归子函数的调用将由基于堆的返回堆栈实现。

我的问题是:是否有算法/论文/实现以不同的方式进行平面评估。我正在寻找一种不转换为字节码但类似于使用下推堆栈的无递归“深度优先遍历”的实现。我想对原始的 s 表达式进行操作。

答案:在 C 语言中实现求值器时,您需要在平面循环中实现整个过程,手动实现返回堆栈和堆栈帧,使用 goto 和 switch() 对控制流进行建模。这是一个例子:flat

c lisp eval s-expression

5
推荐指数
2
解决办法
1257
查看次数

Perl尾数与其他双打不同

我正试图在浮动中扫描: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的二进制文件时,我会得到不同的值.

double perl numeric mantissa

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

通过 cli 访问 zfs 数据集的校验和

是否可以读取/访问 zfs 数据集的校验和?我想访问它以验证它在靴子之间没有改变。阅读https://en.wikipedia.org/wiki/ZFS#ZFS_data_integrity:是否可以从用户空间访问像 zfs 中的校验和方案一样的 Merkle 树的最高校验和?

checksum zfs

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

nom的“ $ i”宏参数从何而来?

我试图了解Rust宏如何捕获工作,并正在查看nom解析器库。

位置nom / src / bytes.rs声明tag!使用捕获的宏($i:expr, $tag: expr)。但是,在使用的所有地方,tag!它仅使用一个参数,即tag!("+")。例如:NOM-lua52 / op.rs。我已经阅读了有关宏的教程,但是这种结构似乎很特殊。

似乎输入$i是某种隐式的

macros rust nom

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

可以在 Raku 中编写 NQP 的优先级解析器

我想弄清楚如何在 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 中完成。

grammar raku nqp

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

在 XMonad 中的多显示器设置中循环浏览工作区

我目前正在使用alt++ctrl和++在工作区之间循环leftaltctrlright

...

    , ((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)

我想要的是一种行为,其中prexWSnextWS跳过当前显示在另一台显示器上的工作区,并仅选择当前未显示的工作区。

是否已经存在这样的命令或者是否有一些xmonad.hs实现此命令的示例?

multiple-monitors xmonad xmonad-contrib

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

Swig + Lua : 调用 m(int argv, char **argc)

我想打电话

 m(int argv, char **argc)
Run Code Online (Sandbox Code Playgroud)

从 Lua 内部使用 Swig 生成的包装器。有谁知道如何做到这一点?在调用 m() 之前,如何告诉 Swig 从 Lua 数据生成“char **”?——康拉德

c lua swig

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

在std容器中使用unique_ptr是否有透明的方法?

是否有透明的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;等,而不必为每次访问包装/解包.

  • 是否有unique_ptr的std容器实现?特别是std::map.
  • 如何实现透明界面?

c++ stdmap unique-ptr c++17

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

模板类型后的星号'*'是什么意思?

我来了一个模板代码,用于*模板类型之后:

  ...
  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)

这个结构描述在哪里?

c++ templates

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