小编Mys*_*tor的帖子

Haskell词法布局规则实现

我一直在研究一种宠物语言,它具有类似Haskell的语法.Haskell做的一件很好的事情,我一直试图复制,是它插入{,}和; 在解析步骤之前,基于代码布局的标记.

我找到了http://www.haskell.org/onlinereport/syntax-iso.html,其中包含了如何实现布局程序的规范,并制作了它的一个版本(当然,为我修改了(更简单) ) 语言).

不幸的是,我输出的输出不正确:

f (do x y z) a b

它应该是生成令牌流ID ( DO { ID ID ID } ) ID ID,而是生成令牌流ID ( DO { ID ID ID ) ID ID }.

我想这是由于我对parse-error(t)(parse-error(t) = false)的实现不满意,但我不知道如何parse-error(t)有效地实现.

像GHC等Haskell编译器如何处理这种情况?是否有一种简单的方法可以实现parse-error(t)它处理这种情况(希望其他人还没有注意到)?

haskell lexer ghc

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

IO Monad采用动态类型语言

在Haskell中,我觉得非常漂亮的一件事是它使用Monads作为有效行为的抽象.它创建了一种非常优雅的方式来表达命令式代码,同时还允许强大的事情发生并保证正确性.

IO monad似乎并不特定于强类型语言.具体来说,在我看来,用动态类型语言实现IO monad并不困难或没有革命性.然后,只需要限制语言,以便所有IO操作只是在IO monad中生成动作.

话虽这么说,我还没有看到任何动态类型的语言(也许我只是看起来不够努力),但使用monads隔离副作用.是否有这种情况的原因?(或它们存在吗?)

monads haskell functional-programming dynamic-typing

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

在 Rust 宏规则中捕获生命周期

在宏规则中!您可以在冒号后说明要解析的不同类型的事物(例如 $x:ident 表示标识符,或 $y:ty 表示类型),但是我对如何声明我想要捕获一生感到困惑,像 'a 或 'static。这现在可能吗?

macros rust

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

在什么条件下现代c ++编译器不执行rvo?

出于性能原因,我有兴趣确保在函数的返回值上执行RVO.什么会阻止这个优化由现代C++编译器(如gcc,clang和msvc 2015)执行,我应该担心什么?

澄清编辑:我感兴趣的是识别(希望最终通过某种形式的静态分析,但后来可能会出现)当从函数返回具有昂贵的复制构造函数(但是廉价的移动构造函数)的特定值时,不执行RVO(意味着正在执行不必要的复制构造函数调用).当std :: move()调用可以避免这种昂贵的操作时尤其如此.

我特别感兴趣的是它实际上由编译器执行的情况,而不是C++ 11规范允许的情况,我认为它比实际实现的情况更广泛.我也对编译器自动使用移动构造函数而不是复制构造函数(如果允许)的情况感兴趣.

c++ optimization clang rvo nrvo

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

如何从指向成员的指针获取指向包含结构的指针?

我有一个类型:

struct Foo {
    memberA: Bar,
    memberB: Baz,
}
Run Code Online (Sandbox Code Playgroud)

和指针,我知道是一个指针memberBFoo:

p: *const Baz
Run Code Online (Sandbox Code Playgroud)

获取指向p: *const Foo原始结构的新指针的正确方法是什么Foo

我当前的实现如下,我很确定调用未定义的行为,因为取消引用(p as *const Foo)where p不是指向a的指针Foo:

let p2 = p as usize -
    ((&(*(p as *const Foo)).memberB as *const _ as usize) - (p as usize));
Run Code Online (Sandbox Code Playgroud)

这是FFI的一部分 - 我不能轻易地重构代码以避免需要执行此操作.

这与指向某个成员的指针的Get指针非常类似,但对于Rust,据我所知,它没有offsetof宏.

pointers rust

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