为了学习一点,kotlin我正在松散地在经典的Monadic Parser Combinators
上构建一个解析器组合库.
在我的情况下,由于递归语法,我需要转发声明一个解析器.在准备最终表达式解析器时,我需要更新前向声明
我的第一次尝试是这样的
val addLike = mulLike separatedBy addLikeSeparator
val expression =
forwarded.second(addLike)
addLike
Run Code Online (Sandbox Code Playgroud)
这个想法是执行一个简短的addLike初始化然后返回初始化值.当我进行一些F#编程时,这是一种非常常见的模式,我认为这是一个很好的模式,因为它简化了隐藏初始化细节.
kotlin但是,这不起作用:
Error:(195, 5) Kotlin: Expecting a top level declaration
Run Code Online (Sandbox Code Playgroud)
这种方法也失败了:
val addLike = mulLike separatedBy addLikeSeparator
val expression = forwarded.second(addLike); addLike
Run Code Online (Sandbox Code Playgroud)
问题似乎是;将两者结合expressions成一个statement.
所以我试着,希望它的行为有点像C/C++,但没有运气:
val addLike = mulLike separatedBy addLikeSeparator
val expression = forwarded.second(addLike), addLike
Run Code Online (Sandbox Code Playgroud)
阅读kotlin规范后,我发现没有明确的解决方案,这就是我转向StackOverflow的原因.这种模式可以用惯用的方式实现kotlin吗?
更新
@Eric建议使用run,如果我更新我的代码,最终解决方案最终有点像这样:
val expression = run () {
forwarded.second(addLike)
whitespaces keepRight addLike keepLeft expectEOS()
}
Run Code Online (Sandbox Code Playgroud)
这对我来说是可以接受的.谢谢@Eric.
您可以使用apply标准库中的功能.它在其接收器上执行操作,然后返回它:
val expression = addLike.apply { forwarded.second(this) }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
436 次 |
| 最近记录: |