我一直在研究一种宠物语言,它具有类似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中,我觉得非常漂亮的一件事是它使用Monads作为有效行为的抽象.它创建了一种非常优雅的方式来表达命令式代码,同时还允许强大的事情发生并保证正确性.
IO monad似乎并不特定于强类型语言.具体来说,在我看来,用动态类型语言实现IO monad并不困难或没有革命性.然后,只需要限制语言,以便所有IO操作只是在IO monad中生成动作.
话虽这么说,我还没有看到任何动态类型的语言(也许我只是看起来不够努力),但使用monads隔离副作用.是否有这种情况的原因?(或它们存在吗?)
在宏规则中!您可以在冒号后说明要解析的不同类型的事物(例如 $x:ident 表示标识符,或 $y:ty 表示类型),但是我对如何声明我想要捕获一生感到困惑,像 'a 或 'static。这现在可能吗?
出于性能原因,我有兴趣确保在函数的返回值上执行RVO.什么会阻止这个优化由现代C++编译器(如gcc,clang和msvc 2015)执行,我应该担心什么?
澄清编辑:我感兴趣的是识别(希望最终通过某种形式的静态分析,但后来可能会出现)当从函数返回具有昂贵的复制构造函数(但是廉价的移动构造函数)的特定值时,不执行RVO(意味着正在执行不必要的复制构造函数调用).当std :: move()调用可以避免这种昂贵的操作时尤其如此.
我特别感兴趣的是它实际上由编译器执行的情况,而不是C++ 11规范允许的情况,我认为它比实际实现的情况更广泛.我也对编译器自动使用移动构造函数而不是复制构造函数(如果允许)的情况感兴趣.
我有一个类型:
struct Foo {
memberA: Bar,
memberB: Baz,
}
Run Code Online (Sandbox Code Playgroud)
和指针,我知道是一个指针memberB在Foo:
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宏.