JHC是一个Haskell编译器,它可以移植生成C代码,然后调用编译器后端来生成可执行文件.
我需要为JHC的运行时系统转储头文件和库,因此android ndk可以使用它来编译生成的C代码.
或者,我需要弄清楚如何将android API链接到JHC.
基本上,我如何将JHC插入android ndk后端?
编辑:我使用JHC可以使用的ndk构建工具之一"build/tools/make-standalone-toolchain.sh"创建了一个独立的编译器.现在我需要找出JHC将我的程序编译成共享对象库的方法,以及如何让JHC不要求"主"功能.
Edit2:我有以下targets.ini和编译脚本.奇怪的是,共享库无法加载.
[android]
cc=arm-linux-androideabi-gcc
cflags+= -shared -fPIC -rdynamic -Wno-all
gc=static
executable_extension=.so
merge=mle32
Run Code Online (Sandbox Code Playgroud)
和
#!/bin/sh
jhc --cross -mandroid \
--main=Main.android_main \
hs/Main.hs -o libs/armeabi/libnative-activity &&
ant debug &&
ant debug install
Run Code Online (Sandbox Code Playgroud) 在Haskell中,我们有能力将类型的约束与逻辑和.
考虑以下
type And (a :: Constraint) b = (a, b)
Run Code Online (Sandbox Code Playgroud)
或者更复杂
class (a, b) => And a b
instance (a, b) => And a b
Run Code Online (Sandbox Code Playgroud)
我想知道如何在Haskell中逻辑或两个约束.
我最接近的尝试就是这个,但它并不常用.在这种尝试中,我用标签来表示类型约束,而不是用隐式参数去除它们.
data ROr a b where
L :: a => ROr a b
R :: b => ROr a b
type Or a b = (?choose :: ROr a b)
y :: Or (a ~ Integer) (Bool ~ Integer) => a
y = case ?choose of
L -> 4
x :: Integer
x …Run Code Online (Sandbox Code Playgroud) 在观看Bret Victor的演讲视频后,我受到启发,写了一个与他在演讲中展示的开发环境有些类似的快速黑客.
基本上这个想法是,一个人在一个窗口中运行app,每当一个人在源文件中保存更改时程序就会改变.
这适用于小的更改,除了我不能在不关闭应用程序和重新编译的情况下更改代码中的状态类型.
如何解决表达式问题并使我的状态的数据类型能够更改而不会导致重新编译?
PS这是代码.我原本不想发帖,因为它真的很乱,而且很快被黑客攻击,但是人们想要它,所以他们可以得到它.
首先是显示器和空闲模块,(这是一个快速的黑客,所以我没有弄清楚如何将它们作为真正的模块).
Idle.hs
\state -> do
counter <- readIORef state
writeIORef state ((counter + 1)`mod`3)
postRedisplay Nothing
Run Code Online (Sandbox Code Playgroud)
Display.hs
\state -> let
cube w = do
renderPrimitive Quads $ do
vertex $ Vertex3 w w w
vertex $ Vertex3 w w (-w)
vertex $ Vertex3 w (-w) (-w)
vertex $ Vertex3 w (-w) w
vertex $ Vertex3 w w w
vertex $ Vertex3 w w (-w)
vertex $ Vertex3 (-w) w (-w) …Run Code Online (Sandbox Code Playgroud) 无锁数据结构中ABA问题的一种流行解决方案是使用额外的单调递增标记来标记指针.
struct aba {
void *ptr;
uint32_t tag;
};
Run Code Online (Sandbox Code Playgroud)
但是,这种方法存在问题.它真的很慢,并且存在巨大的缓存问题.如果我抛弃标签字段,我可以获得两倍的加速.但这不安全吗?
所以我下一次64位平台的尝试填充了ptr字段中的位.
struct aba {
uintptr __ptr;
};
uint32_t get_tag(struct aba aba) { return aba.__ptr >> 48U; }
Run Code Online (Sandbox Code Playgroud)
但有人告诉我,标签只有16位是不安全的.我的新计划是使用指针对齐缓存行来填充更多标记位,但我想知道它是否有效.
如果无法工作,我的下一个计划是使用Linux的MAP_32BIT mmap标志来分配数据,所以我只需要32位指针空间.
在无锁数据结构中,ABA标记需要多少位?
我有一个分段控件.每当视图完成显示时,我创建一个条形按钮项来保存它并将其设置为工具栏项.我遇到的问题是分段控件不会填满工具栏中的空间,即使它被设置为具有空间填充行为.
如何在iOS应用程序的工具栏中使用空间填充分段控件?
对于我的OpenGL着色器程序所采用的每个点,它创建一个红色环,在不透明和完全透明之间平滑过渡.我的着色器程序有效,但有绑定工件.
片段着色器如下.
#version 110
precision mediump float;
void main() {
float dist = distance(gl_PointCoord.xy, vec2(0.5, 0.5));
// Edge value is 0.5, it should be 1.
// Inner most value is 0 it should stay 0.
float inner_circle = 2.0 * dist;
float circle = 1.0 - inner_circle;
vec4 pixel = vec4(1.0, 0.0, 0.0, inner_circle * circle );
gl_FragColor = pixel;
}
Run Code Online (Sandbox Code Playgroud)
这是不太有趣的顶点着色器,我认为不是导致问题的原因.
#version 110
attribute vec2 aPosition;
uniform float uSize;
uniform vec2 uCamera;
void main() {
// Square the view …Run Code Online (Sandbox Code Playgroud) 我的程序从文件中读取4个字节的IEEE 754浮点数.我需要将这些字节可移植地转换为我的C编译器浮点类型.换句话说,我需要一个函数与float IEEE_754_to_float(uint8_t raw_value[4])我的C程序的原型.
我完全清楚,过去 Windows 套接字仅作为第三方用户模式 DLL 实现,并且套接字和对象句柄是不相关的。然而,在现代 Windows NT 系统上,套接字是完整的内核对象,尽管也有一些用户模式状态。
我正在重新编写游戏,我问了一个问题," 我如何迭代四重链接的二维数据网格,好像它是一个二维数组? ",适用于Haskell.
为了首先创建数据网格,我使用了一种非常命令式的算法,如下所示.它依赖的关键特性是我可以将索引转换为数组并从中创建引用.例如,"&array [x] [y]".
我需要能够将索引转换为可变数组,并在Haskell中从中生成状态引用.因此类型签名可能是
convertToSTRef :: i -> STArray s i a -> ST s (STRef s a)
Run Code Online (Sandbox Code Playgroud)
我查看了文档,尝试过hoogle和hayoo,但没有找到完成此任务的方法.
PS或者,如果某人有我可以使用的不同算法,那就太棒了.
PSS简单的命令式算法.
const size_t rows = 20;
const size_t columns = 59;
block tiles[columns][rows];
block * const start = &tiles[columns/2][rows/2];
for (size_t x = 0; x < columns; ++x)
for (size_t y = 0; y < rows; ++y)
{
tiles[x][y].floor = '^';
tiles[x][y].inhabitant = WALL;
tiles[x][y].side_block[EAST] = (x + 1 < columns) ? &tiles[x + 1][y] : NULL; …Run Code Online (Sandbox Code Playgroud) 我想编写一个启动另一个应用程序的应用程序.像这样:
# This will launch another_app.exe
my_app.exe another_app.exe
# This will launch another_app.exe with arg1, arg and arg3 arguments
my_app.exe another_app.exe arg1 arg2 arg3
Run Code Online (Sandbox Code Playgroud)
这里的问题是我正在进入char* argv[]我的main函数,但我需要将它合并到LPTSTR以便将其传递给CreateProcess.
有一个GetCommandLine函数,但我不能使用它,因为我从Linux移植代码并绑定argc/argv(否则,这对我来说是一个非常难看的黑客).
我不能轻易地手动合并参数,因为argv[i]可能包含空格.
基本上,我想反过来CommandLineToArgvW.有没有标准的方法来做到这一点?