小编zen*_*nix的帖子

从 C 代码调用 Raku 代码的协议是什么?

假设我在 C 中有我的事件驱动的 TCP 通信库。

在我的 Raku 应用程序中,我可以使用 NativeCall 调用 C 库中的函数。

my $server = create-server("127.0.0.1", 4000);
Run Code Online (Sandbox Code Playgroud)

现在,从我用C回调(say onAccept)我想调出在我的应用程序乐功能(说on-accept(connection)那里connection将是一个指向C结构)。

那么,我该怎么做:on-accept从我的 C 函数调用我的 Raku函数onAccept

附:我尝试使用一个简单的标题“如何从 C 代码调用 Raku 代码”进行发布,但无论出于何种原因,stackoverflow.com 都不允许我这样做。正因为如此,我编造了这个花哨的标题。

我正在创建一个 32 位 DLL。我们必须明确告诉 CMake 配置 64 位构建。

cmake -G "Visual Studio 14 2015 Win64" ..
Run Code Online (Sandbox Code Playgroud)

无论如何,现在代码运行了,这不是我所要求的,因为回调仍然在 C 中。

我所要求的似乎不太可能。

我尝试使用 Haakon 建议的方法,但恐怕我不明白它是如何工作的。

我在 Windows 中,不幸的是,Raku 找不到我的 dll,即使我将它们放在 C:\Windows\System32 中。它找到“msvcrt”(C 运行时),但没有找到我的 dll。

dll 代码(Visual Studio 2015)。

#include <stdio.h>

#define EXPORTED __declspec(dllexport) …
Run Code Online (Sandbox Code Playgroud)

raku

14
推荐指数
2
解决办法
350
查看次数

如何声明一个接受类型化数组参数的函数

假设我想声明一个函数,其参数是一个字符串数组:

sub process-string-array(Str[] stringArray) # invalid
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

raku

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

如何在 sub MAIN 中获取强制命名参数?

这是我能得到的最好的:

sub MAIN(Int :p($parm)!)
{
  say "* parm=", $parm;
}
Run Code Online (Sandbox Code Playgroud)

但:

$ raku test-par.raku
Usage:
  test-par.raku -p[=Int]
Run Code Online (Sandbox Code Playgroud)

它说参数是可选的!
确实如此:

 $ raku test-par.raku -p
 * parm=True
Run Code Online (Sandbox Code Playgroud)

那么,什么给出了?

raku

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

Cro WebSocket客户端看不到服务器何时出局

下面的客户端程序从WebSocket服务器接收消息.
它不发送任何消息.

客户

use v6;
use Cro::WebSocket::Client;

constant WS-URL = 'ws://localhost:20000/status';
constant TIMEOUT-TO-CONNECT = 5; # seconds

my $timeout;
my $connection-attempt;

await Promise.anyof(
  $connection-attempt = Cro::WebSocket::Client.connect(WS-URL),
  $timeout = Promise.in(TIMEOUT-TO-CONNECT));

if $timeout.status == Kept
{
  say "* could not connect to server in ', TIMEOUT-TO-CONNECT, ' seconds";
  exit 1;
}

if $connection-attempt.status != Kept
{
  my $cause = $connection-attempt.cause;
  say '"* error when trying to connect to server';
  say '"* --------------------------------------';
  # $cause is a long string, how do we get …
Run Code Online (Sandbox Code Playgroud)

perl6 cro

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

应用于 sub 时,.first 和 .return 是什么?

我在某处找到了该运算符,当我在https://docs.raku.org/routine/andthen中查找它时,我发现了这个:

\n
#!/bin/env raku\nsub load-data\n{\n  rand  > .5 or return; # simulated load data failure; return Nil\n  (rand > .3 ?? \'error\' !! \'good data\') xx 10 # our loaded data \n}\n\nload-data.first: /good/ andthen say "$_ is good";\n# OUTPUT: \xc2\xab(good data is good)\xe2\x90\xa4\xc2\xbb \n\nload-data() andthen .return; # return loaded data, if it\'s defined \ndie "Failed to load data!!";  \n
Run Code Online (Sandbox Code Playgroud)\n

那么,当应用于 subs 时,它是如何.first工作.return的?\n我以前从未见过这样的事情。

\n

raku

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

按位运算.这段代码安全且便携吗?

我需要计算表示为char数组的位集之间的汉明距离.这是一项核心操作,因此必须尽可能快.我有这样的事情:

const int N = 32; // 32 always

// returns the number of bits that are ones in a char
int countOnes_uchar8(unsigned char v);

// pa and pb point to arrays of N items
int hamming(const unsigned char *pa, const unsigned char *pb)
{
  int ret = 0;
  for(int i = 0; i < N; ++i, ++pa, ++pb)
  {
    ret += countOnes_uchar8(*pa ^ *pb);
  }
  return ret;
}
Run Code Online (Sandbox Code Playgroud)

在分析之后,我注意到在ints上运行更快,所以我写道:

const int N = 32; // …
Run Code Online (Sandbox Code Playgroud)

c++

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

Raku 运算符用于 2 的补码算术?

我有时会用这个:

$ perl -e "printf \"%d\", ((~18446744073709551592)+1)"
24
Run Code Online (Sandbox Code Playgroud)

我似乎无法用 Raku 做到这一点。我能得到的最好的是:

$ raku -e "say +^18446744073709551592"
-18446744073709551593
Run Code Online (Sandbox Code Playgroud)

那么:我怎样才能让 Raku 给我和 Perl 相同的答案呢?

raku

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

不能运行"cro stub"等

通过Zef安装Cro,但不能运行"cro stub","cro run"等
(编辑:Fedora 28,来自Fedora的rakudo)

[zv@localhost ~]$ cro stub hello  
bash: cro: command not found...  
[zv@localhost ~]$
Run Code Online (Sandbox Code Playgroud)

那么,"cro"安装在哪里?在任何地方都找不到它.

[zv@localhost ~]$ which cro  
/usr/bin/which: no cro in (/usr/share/Modules/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/home/zv/.local/bin:/home/zv/bin)  
[zv@localhost ~]$ zef info cro  
- Info for: cro  
- Identity: Cro::Core:ver<0.7.6>  
- Recommended By: /home/zv/.perl6  
- Installed: Yes  
Description:     Implements the asynchronous pipeline at the heart of all Cro libraries.  
Run Code Online (Sandbox Code Playgroud)

[zv @ localhost~] $ zef info cro
- 信息:cro
- 身份:Cro :: Core:ver <0.7.6>
- 推荐人:/home/zv/.perl6
- 已安装:是
描述:实现异步管道位于所有Cro图书馆的核心.
许可证:Artistic-2.0
Source-url:https …

perl6 cro

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

将元素推送到 Buf

这不应该有效吗?

use v6;

my $data1 = Buf.new(1, 2, 3);
my Buf $data2;

my $n = $data1.bytes;

for ^$n
{
  my $ch = $data1.shift;
  $data2.push($ch)
}             
Run Code Online (Sandbox Code Playgroud)

我越来越

$ raku bufpush.raku
Cannot resolve caller push(Buf:U: Int:D); none of these signatures matches:
    (Buf:D: int $got, *%_)
    (Buf:D: Int:D $got, *%_)
    (Buf:D: Mu:D $got, *%_)
    (Buf:D: Blob:D $buf, *%_)
    (Buf:D: **@values, *%_)
  in block <unit> at bufpush.raku line 11
Run Code Online (Sandbox Code Playgroud)

raku

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

如何处理IO::Socket::INET中的异常?

假设本地主机中没有应用程序侦听端口 12340。

下面的命令不应该打印“error”吗?

$ raku -e "IO::Socket::INET.new(:host('localhost'), :port(12340)) or die 'error'"
Could not connect socket: No connection could be made because the target machine actively refused it.

  in block <unit> at -e line 1
Run Code Online (Sandbox Code Playgroud)

raku

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

标签 统计

raku ×7

cro ×2

perl6 ×2

c++ ×1