在Node.js中有一种简单的方法来读取PNG文件并获取图像的像素吗?像节点图像,但另一种方式:)
我浏览了https://github.com/joyent/node/wiki/modules#wiki-graphics中列出的库,但它们或者是命令行工具的简单包装器,提供裁剪和调整大小或复杂的绘图工具node-canvas
.
我想在我的Haskell程序中使用基于文本的UI.我找到了ncurses库的一些绑定(另请参阅hscurses或ncurses,使用哪一个?).在hscurses
和nanocurses
包都是围绕C库只是简单的包装,而vty
不是非常有据可查,并有点难看(例如混合snake_case和驼峰).
ncurses
Hackage上的库看起来更漂亮,并且提供了非常适合Haskell的API.问题是它似乎没有实现一些关键功能,如调整大小或刷新窗口.
所以我的问题是:
ncurses
Haskell库至少支持窗口刷新和调整大小?(这可能应该与项目所有者协商,但我需要快速解决方案)编辑:
我终于在nscurses
没有窗户(和面板)的情况下使用,以避免让他们感到烦恼.输出到窗口的右下角我遇到了问题(Python的ncurses绑定报告了一个非常类似的问题).我没有写那里解决它:).
函数timeout
和getch
Haskell中使用的ncurses库有一个奇怪的问题.当我从GHCi或runhaskell使用它们时,它们按预期工作 - getch
等待给定的毫秒数timeout
然后返回,即使没有给出输入.但是当我使用GHC 编译同一个文件时,getch
立即返回.
我为Haskell尝试了两个ncurses绑定; hscurses
:
import UI.HSCurses.Curses
main = do
initCurses
timeout 1000
c <- getch
endWin
print c
Run Code Online (Sandbox Code Playgroud)
并且ncurses
:
import UI.NCurses
main = do
e <- runCurses $ do
win <- defaultWindow
getEvent win $ Just 1000
print e
Run Code Online (Sandbox Code Playgroud)
两者都表现出与之前描述的相同的奇怪方式.
我也试过C中的等价程序:
#include <ncurses.h>
int main()
{
initscr();
wtimeout(stdscr,1000);
int c = getch();
endwin();
printf("%d\n", c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个按预期工作.
所以我的问题是:当使用解释后的终端和编译的Haskell时,有什么能够产生差异?runhaskell和ghci修改了一些微妙的终端设置吗?或者编译后的代码是否以不同的方式加载库?
添加:
我试图使用FFI从编译的Haskell调用C程序,它立即返回(这是不正确的).我认为这意味着问题不在库中,而是在GHC运行时的某个地方.
我正在编写一个小的Haskell编译器,我想尽可能多地实现Haskell 2010.我的编译器可以解析模块,但是将模块完成到程序似乎是一项非常重要的任务.我编写了一些棘手但可能有效的Haskell模块示例:
module F(G.x) where
import F as G
x = 2
Run Code Online (Sandbox Code Playgroud)
这里模块F
导出G.x
,但是G.x
相同F.x
,因此模块F
导出x
当且仅当它导出时x
.
module A(a) where
import B(a)
a = 2
module B(a) where
import A(a)
Run Code Online (Sandbox Code Playgroud)
在这个例子中,要解决模块的出口A
,编译器检查a
进口来自B
相同的声明a = 2
,但B
出口a
,当且仅当,A
出口a
.
module A(f) where
import B(f)
module B(f) where
import A(f)
Run Code Online (Sandbox Code Playgroud)
在解析模块期间A
,编译器可能假设f
从B
存在导入,意味着A
导出f
,因此 …
我template<bool VAR> struct Obj
在头文件(obj.h
)中声明了一个模板,带有显式自动移动构造函数(= default
).
// obj.h
#pragma once
#include <vector>
template<bool VAR>
struct Obj {
std::vector<int> member;
Obj(int m): member(m) { }
Obj(Obj&&) = default;
int member_fun() const;
};
extern template struct Obj<false>;
extern template struct Obj<true>;
Run Code Online (Sandbox Code Playgroud)
模板的成员函数在另一个文件(obj.cpp
)中定义,并显式模板化实例化:
// obj.cpp
#include "obj.h"
template<bool VAR>
int Obj<VAR>::member_fun() const {
return 42;
}
template struct Obj<false>;
template struct Obj<true>;
Run Code Online (Sandbox Code Playgroud)
然后从主文件(main.cpp
)中使用此模板:
// main.cpp
#include <utility>
#include "obj.h"
int main() {
Obj<true> o1(20); …
Run Code Online (Sandbox Code Playgroud) 我正在做一些非常简单的基准来比较C和Rust的性能.我使用了一个函数添加整数1 + 2 + ... + n
(我可以通过手工计算验证的东西),其中n = 10^10
.
Rust中的代码如下所示:
fn main() {
let limit: u64 = 10000000000;
let mut buf: u64 = 0;
for u64::range(1, limit) |i| {
buf = buf + i;
}
io::println(buf.to_str());
}
Run Code Online (Sandbox Code Playgroud)
C代码如下:
#include <stdio.h>
int main()
{
unsigned long long buf = 0;
for(unsigned long long i = 0; i < 10000000000; ++i) {
buf = buf + i;
}
printf("%llu\n", buf);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我编译并运行它们:
$ rustc sum.rs -o …
Run Code Online (Sandbox Code Playgroud) haskell ×3
ncurses ×2
c++ ×1
c++11 ×1
compilation ×1
gcc ×1
ghc ×1
ghci ×1
node.js ×1
optimization ×1
png ×1
runhaskell ×1
rust ×1
templates ×1