我正在尝试使用GHC API动态编译和加载Haskell模块.我理解API从一个版本到另一个版本的波动很大,所以我特别谈到GHC 7.6.*.
我试过在MacOS和Linux上运行相同的代码.在这两种情况下,插件模块都可以正常编译,但在加载时会出现以下错误:Cannot add module Plugin to context: not interpreted
问题类似于本文中的问题,只有在主机程序的同一运行中编译模块时才会加载该问题.
-- Host.hs: compile with ghc-7.6.*
-- $ ghc -package ghc -package ghc-paths Host.hs
-- Needs Plugin.hs in the same directory.
module Main where
import GHC
import GHC.Paths ( libdir )
import DynFlags
import Unsafe.Coerce
main :: IO ()
main =
defaultErrorHandler defaultFatalMessager defaultFlushOut $ do
result <- runGhc (Just libdir) $ do
dflags <- getSessionDynFlags
setSessionDynFlags dflags
target <- guessTarget "Plugin.hs" Nothing
setTargets [target]
r …Run Code Online (Sandbox Code Playgroud) 我有一个使用语句块的程序EDSL.
尽管语句之间可能存在依赖关系,但这些语句没有按特定顺序添加到块中.
但是,在编译EDSL期间,我需要确保语句按依赖顺序排序,例如
B := A
C := B
E := D
Run Code Online (Sandbox Code Playgroud)
由于并非所有语句都具有依赖性,因此没有总顺序(例如,E := D上面是独立的,可以放在任何地方).没有循环依赖关系,因此列表排序应该是可能的.
我试图通过使用Data.List.sortBy和定义Ordering哪些将返回EQ意味着语句没有依赖性来破解解决方案.这适用于一些示例,但不适用于一般情况,例如,订购以下内容无效:
C := B B := A
D := C = should produce => C := B
B := A D := C
Run Code Online (Sandbox Code Playgroud)
这是因为默认排序插入排序并且只确保插入的项目小于或等于下一个.
我已经在互联网上搜索了Poset实现,但没有找到任何适用的东西:
altfloat:Data.Poset定义Ordering = LT | GT | EQ | NC(NC非可比的),这是好的,但所提供的sort呈NaN样不具有可比性的项目,只是抛出他们离开.
logfloat:Data.Number.PartialOrd类似于上面的除了用途Maybe Ordering,我没有在包中的任何地方看到排序功能.
Math.Combinatorics.Poset我还没弄清楚如何使用它或它是否适用.
下面是一个包含绑定和非绑定语句的最小示例.非biniding语句的顺序很重要,并且它们必须保持原始顺序(即排序需要与没有依赖关系的语句保持稳定).
我希望有一个简单的解决方案,而不使用完整的依赖图...
module Stmts where …Run Code Online (Sandbox Code Playgroud) 我们与Celery执行者一起进行了Airflow部署。
我们的许多DAG都需要对BashOperator或中的某些文件进行本地处理PythonOperator。
但是,根据我们的理解,给定DAG的任务可能并不总是安排在同一台计算机上。
我到目前为止收集的任务之间的状态共享选项:
用途Local Executors -这可能适合一个团队,具体取决于工作量,但可能无法扩展到更广泛的公司
使用XCom -这有大小限制吗?可能不适合大文件
为需要在两者之间进行本地处理的任务的每种组合编写自定义运算符。这种方法降低了任务的模块化,并需要复制现有的操作员代码。
使用Celery队列将DAG路由到同一工作人员(docs)-起初该选项似乎很吸引人,但是为了避免将所有路由都路由到一个执行者或制作100万个队列,什么合适的设置方式?
在运行执行程序的所有计算机上使用共享的网络存储 -似乎增加了基础架构负担,但有可能。
在Airflow中的任务之间共享大型中间状态(例如文件)的推荐方法是什么?
我有一个EDSL它提供了列表式组合子数组(map,zipWith,等.)
一些组合器要求某些输入是随机访问.例如,Gather从另一个指定的索引处从数据数组中选择元素的数据数组:
Gather (Manifest [10,11,12]) (Manifest [2,0,0,1,2]) = [12,10,10,11,12]
Run Code Online (Sandbox Code Playgroud)
该语言使用data-reify包来恢复共享.问题在于,有时相同的子树包含需要提供随机访问的节点和可以按顺序计算的节点.让他们共享会破坏后续的评估者.
例如,在下面的树中,我希望[1,2,3]保持共享,但Manifests将它们包装为恢复图中的不同节点:
[1, 2, 3]
/ \
Manifest Manifest
| |
| Map (+1)
\ /
Gather
Run Code Online (Sandbox Code Playgroud)
更复杂的示例可能包括许多共享节点,所有共享节点都应该变得不同(即使Map (+1) (Manifest [1,2,3])可以共享).
[1, 2, 3]
/ \
Manifest Manifest
| |
Map (+1) Map (+1)
| /|
Map (*2) / |
\ / |
Gather |
\ |
ZipWith (+)
Run Code Online (Sandbox Code Playgroud)
即使我找到了简单案例(直接Gather引用Manifest)的解决方案,它也已经涵盖了大多数用例.
欢迎任何指示!
下面是一个简单的语言模型.
module …Run Code Online (Sandbox Code Playgroud) 我一直试图找到某种点文件来放入Scala REPL设置和自定义函数.
特别是我有兴趣传递它的标志-Dscala.color(启用语法高亮),以及覆盖结果字符串截断等设置:
scala> :power
scala> vals.isettings.maxPrintString = 10000
Run Code Online (Sandbox Code Playgroud)
将这些设置应用于简单的Scala REPL会话以及sbt控制台会话会很不错.
Scala是否存在这样的中央配置位置?