小编Sod*_*hty的帖子

在Chicken Scheme中使用vs Import vs Require vs Require-extension

我对鸡肉(use)(import)鸡肉之间的差异有点朦胧.同样,怎么办(load),(require)又有(require-extension)什么不同?

网站上似乎没有提到这些东西.

scheme chicken-scheme

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

如何在std :: function的签名上重载构造函数?

我正在尝试编写一个带有重载构造函数的类,它接受std :: function对象作为参数,但当然每个该死的东西都可以隐式地转换为任何签名的std :: function.这自然是非常有用的.

例:

class Foo {
  Foo( std::function<void()> fn ) {
    ...code...
  }
  Foo( std::function<int()> fn ) {
    ...code...
  }
};

Foo a( []() -> void { return; } );    // Calls first constructor
Foo b( []() -> int { return 1; } );   // Calls second constructor
Run Code Online (Sandbox Code Playgroud)

这将无法编译,抱怨两个构造函数基本相同且含糊不清.当然,这是无稽之谈.我尝试过enable_if,is_same和其他一些东西.接受函数指针是不可能的,因为这会阻止有状态lambda的传递.当然必须有办法实现这一目标吗?

我害怕,我的模板技能有点缺乏.普通的模板类和函数很容易,但使用编译器玩傻傻的玩家有点超出了我的联盟.有人可以帮帮我吗?

我之前已经知道这个问题的变体,但它们通常关注的是正常的函数而不是构造函数; 或者通过参数而不是返回类型进行重载.

c++ lambda constructor overloading c++11

12
推荐指数
2
解决办法
644
查看次数

如何生成没有依赖项的Crystal可执行文件?

我正在用Crystal编写一个程序,我打算编译并移动到其他系统执行.理想情况下,它应该没有依赖关系,因为目标系统将是linux的全新安装.

遗憾的是,我无法绕过libc依赖,所以我可能必须在拥有我希望定位的最低版本libc的系统上编译可执行文件.我认为它应该是向前兼容的.

但是,我对libssl有困难.Debian Wheezy的默认安装似乎没有附带libssl,因此运行我的可执行文件时出现此错误:

error while loading shared libraries: libssl.so.1.0.0:
cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我认为这种依赖存在,因为我require "http/client"在我的源代码中.但是,我没有进行与ssl相关的调用,因为我只使用它连接到不安全的网站.

我显然也有依赖libevent-2.0.so.5.据推测,所有Crystal程序都可以.谁知道Crystal有多少其他依赖?

我的可执行文件必须在新安装的Linux系统上运行.那么,如何生成没有依赖项的Crystal可执行文件?我认为除了libc之外.

dependencies static-linking crystal-lang

9
推荐指数
2
解决办法
1614
查看次数

如何在C++中重载std :: function签名

我知道这个问题之前已被问过,但尽管我是一位经验丰富的编码员,但我不理解答案,也没有办法回答这些先前的问题,要求澄清.没有"回复"链接或任何东西.此外,这些问题还很旧.所以,我重新问这个问题.

我有一个类,我正在重载+ =运算符.我想要一个重载来获取一个裸函数指针,另一个需要一个std :: function:

void operator+=(void (*handler)());
void operator+=(function<void (void *, T)> handler);
Run Code Online (Sandbox Code Playgroud)

用法:

MyClass a;
a += [](){ DoSomething(); };
a += [](void *x, T y){ DoSomething(); };
Run Code Online (Sandbox Code Playgroud)

遗憾的是,代码无法编译,因为编译器无法确定第二个重载是否不适合第一个+ =调用.

如何定义我的operator + =成员函数来纠正这个问题?我不想改变运算符的使用方式(例如通过使用显式转换).我希望他们像上面所说的那样工作.

此外,还有以下过载也很方便:

void operator+=(function<void()> handler);
Run Code Online (Sandbox Code Playgroud)

但同样,我不能基于函数<>模板的签名重载.

有关更多示例,请参阅此主题:std :: function的模板参数(签名)是否是其类型的一部分? (我尝试实现该线程中提到的各种解决方案,但没有一个会编译)

我已经用多种语言编程了很多年,但我的C++技能有点生疏.

c++ lambda overloading signature

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

如何编译多个Chicken Scheme文件?

我需要编译一个包含多个源文件的 Chicken Scheme 项目,但出现错误。

根据手册这个 SO answer,我需要将(declare)s 放在我的来源中。为什么编译器不能只看到我正在导入另一个源,这超出了我的理解,但是我不知道。

问题是,即使我把(declare)s放进去,编译器也会抱怨(import)s 和(use)s。

infinity.filesystem.scm:

(use bindings filepath posix)
(declare (uses infinity.general.scm))
(load-relative "infinity.general.scm")

(module infinity.filesystem (with-open-file make-absolute-path with-temporary-directory with-chdir)
 (import scheme filepath posix infinity.general)
 (begin-for-syntax
  (use bindings chicken)
  (import infinity.general))

 ...etc...
Run Code Online (Sandbox Code Playgroud)

infinity.general.scm:

(declare (unit infinity.general.scm))
(require-extension srfi-1 srfi-13 format data-structures ansi-escape-sequences basic-sequences)
(module infinity.general (bind+ format-ansi repeat-string join-strings pop-chars! inc! dec!
                          take* drop* take-right* drop-right* ends-with? take-where)
 (import scheme …
Run Code Online (Sandbox Code Playgroud)

scheme compiler-errors compilation chicken-scheme

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

在Scheme中让-over-lambda?

在 Common Lisp 中,如果我希望两个函数共享状态,我将执行let over lambda,如下所示:

(let ((state 1))
 (defun inc-state ()
  (incf state))
 (defun print-state ()
  (format t "~a~%" state))
Run Code Online (Sandbox Code Playgroud)

这些函数不是本地函数let- 它们是全局函数,维护对共享状态变量的引用,该变量本身从外部不可见。例如,我可以在代码中的其他位置执行以下操作:

(print-state)       => 1
(inc-state)         => 2
(print-state)       => 2
Run Code Online (Sandbox Code Playgroud)

然而,在Scheme中,这样的构造声明了从外部不可见的局部函数:

(let ((state 1))
 (define (print-state)
  (print state))

 (print-state))     => 1

(print-state)       => error, no such variable print-state
Run Code Online (Sandbox Code Playgroud)

我认为实现这种功能的唯一方法(除了在模块内使用未导出的全局变量之外)是这样的:

(define print-state #f)
(define inc-state #f)

(let ((state 1))
 (set! print-state (lambda () (print state)))
 (set! inc-state (lambda () (inc! state))))
Run Code Online (Sandbox Code Playgroud)

在Scheme中是否有一种方法可以编写 …

lambda scheme chicken-scheme let-over-lambda

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

如何在 Ruby 中使用 HTTP 服务器发送的事件?

我需要连接到 HTTP 服务器并订阅服务器发送事件 (SSE)源。

我发现支持这一点的唯一宝石是em-eventsource严重损坏)和sse-client-ruby,它似乎是一个裸露的片段,需要未指定的额外管道才能工作。

还有其他我可以使用的 Ruby gem 吗?或者,有人可以提供一个在 Ruby 中使用 SSE 事件的简单的本地示例吗?

ruby http server-sent-events

5
推荐指数
0
解决办法
1076
查看次数

在 Lisp 中,使用 let* 还是 setf 更惯用?

当计算一个值需要多个步骤时,我倾向于使用(let*)声明变量的多个版本,因此:

(let* ((var 1)
       (var (* var 2))
       (var (- var)))
 (format t "var = ~a~%" var))
Run Code Online (Sandbox Code Playgroud)

而不是在其他语言中期望的更命令式的风格:

(let ((var 1))
 (setf var (* var 2))
 (setf var (- var))
 (format t "var = ~a~%" var))
Run Code Online (Sandbox Code Playgroud)

(显然,这是一个过于简单的例子,我通常会将其合并为一个声明。)

我想我只是更喜欢第一个版本,因为我从来没有真正改变状态。它看起来更“实用”或更干净——当然,可能更线程安全。

但在我看来,后者在内存分配或执行周期方面可能“更便宜”。

这些做法中的一种是否[a] 比另一种更惯用?或 [b] 在内存使用或时钟周期方面更有效?

编辑:来自我的代码的真实示例。

(let* ((config-word      (take-multibyte-word data 2 :skip 1))
       (mem-shift-amount ...)
       (config-word      (translate-incoming-data config-word mem-shift-amount blank-value)))

  ...)
Run Code Online (Sandbox Code Playgroud)
(let* ((reserve-byte-count (get-config :reserve-bytes))
       (reserve-byte-count (and (> reserve-byte-count 0) reserve-byte-count))
  ...)
Run Code Online (Sandbox Code Playgroud)
(let* ((licence                (decipher encrypted-licence decryption-key))
       (licence-checksum1      (coerce …
Run Code Online (Sandbox Code Playgroud)

lisp optimization scheme idioms common-lisp

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

Visual Studio观察窗口如何知道扩展`std :: vector <T>`并显示元素?

如果std::vector<T>在观察窗口中展开a ,您将获得"[0]","[1]"等项目,对于集合中的每个值都会有一个.

当实现我自己的集合类(顺便说一下,包装动态数组)时,我想要同样的功能.

Visual Studio如何知道在监视窗口中显示多少元素std::vector

c++ std visual-studio

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

如何在捕获输出时在Crystal中执行shell脚本?

我想在处理stdout和stderr输出时执行shell脚本.目前我使用Process.run,shell=false和stdin,stdout和stderr三个管道执行命令.我生成光纤以从stdout和stderr读取并记录(或以其他方式处理)输出.这对于单个命令非常有效,但对于脚本来说却非常糟糕.

我可以简单地设置shell=true调用时Process.run,但看看Crystal源代码似乎只是在命令行上加上"sh".我试过在"bash"前加上它并没有帮助.

重定向(>file)和管道(例如curl something | bash)之类的东西似乎不起作用Process.run

例如,要下载shell脚本并执行它,我尝试:

cmd =%{bash -c"curl http://dist.crystal-lang.org/apt/setup.sh "| 庆典}

Process.run(cmd,...)

bash添加了初始值,希望能够启用管道操作员.它似乎没有帮助.我也尝试分别执行每个命令:

script.split("\n").reject(/ ^#/,"").each {Process.run(...)}

但是,当命令使用重定向或管道时,仍然会失败.例如,该命令echo "deb http://dist.crystal-lang.org/apt crystal main" >/etc/apt/sources.list.d/crystal.list只输出:

"deb http://dist.crystal-lang.org/apt crystal main">/etc/apt/sources.list.d/crystal.list`

如果我使用``反引号执行方法,它可能会起作用; 但后来我无法实时捕获输出.

linux bash shell crystal-lang

4
推荐指数
2
解决办法
2556
查看次数