因此,在Elixir文档的这一页中,我和一些朋友围绕着一段话进行了对话.
在Elixir中,可以抛出一个值,然后被捕获.throw和catch保留用于无法检索值的情况,除非使用throw和catch.
除非与未提供适当API的库接口,否则这些情况在实践中非常罕见.
哪些情况需要使用try/throw/catchvs. try/rescue?这是为了与一些现有的Erlang库连接吗?页面上的示例显示了Elixir代码,这是我觉得有点混乱.
什么是我应该寻找的"适当的API"?我的意思是这是一个协议吗?
我做了一些谷歌搜索试图回答这个问题,但即使在那之后,我也不太清楚某些事情.是否可以从VB6创建一个控制台应用程序?
我有一个没有窗口的VB6应用程序.我一直认为它是一个控制台应用程序.但是,我希望能够在其中使用Windows API SetConsoleCtrlHandler函数.我相信使用C++/MFC应用程序,您必须设置链接器开关以创建控制台应用程序.我的一位开发人员告诉我,VB6并没有创建一个真正的控制台应用程序,因此这不起作用.那么有可能创建一个Windows将从VB6识别为控制台应用程序的控制台应用程序吗?
平台:Windows XP SP2
开发平台:VB6
为什么我不能用这个简单的for循环填充列表?
new_data = []
for data <- old_data do
new_data = List.insert_at(new_data, -1, data)
end
Run Code Online (Sandbox Code Playgroud)
在此操作之后new_data,即使循环执行了N次,我的列表仍然为空.
有许多用Erlang编写的数据存储,例如Riak,Dynomite,CouchDb,Scalaris,我错过了吗?
我知道Java和C/C++也被用来编写数据存储区(Cassandra,Hypertable等),但是有任何数据存储区都是用F#,Scala,Haskell,Clojure等其他函数语言编写的吗?我问这个(以及许多其他函数式编程和Erlang类型问题)的原因是评估函数式编程语言对于现实世界项目的可行性.
作为旁注,我已经向我指出,我的意思是数据存储区本身的实际实现语言,而不是访问数据存储区的客户端语言(即:通过ODBC).
我试图弄清楚这个C#属性声明的F#等价物:
[
ComImport(),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
Guid("000214EE-0000-0000-C000-000000000046")
]
Run Code Online (Sandbox Code Playgroud)
我可以做到这一点并且编译得很好:
[<ComImport>]
[<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>]
[<Guid("000214EE-0000-0000-C000-000000000046")>]
Run Code Online (Sandbox Code Playgroud)
但我现在很好奇 - 是否可以在F#中组合多个属性?当我尝试这样的东西时,前两个属性:
[<ComImport>,<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>]
Run Code Online (Sandbox Code Playgroud)
我收到FS0010错误.还试过这个:
[<ComImport , InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>]
Run Code Online (Sandbox Code Playgroud)
结果相同.
这是可能的,如果是这样,那么正确的语法是什么?
我试图用Newtonsoft.Json 5.0.4将一些非常简单的json反序列化为F#:
#if INTERACTIVE
#r "C:/Users/OCatenacci/fshacks/CreateWeeklySWEEventsEmail/packages/Newtonsoft.Json.5.0.4/lib/net40/Newtonsoft.Json.dll"
#endif
open System
open Newtonsoft.Json
type meta() = class
member val count = 0 with get, set
end
let testjson = """{
"meta": {
"count": 15
}
}"""
let o = JsonConvert.DeserializeObject<meta>(testjson)
Run Code Online (Sandbox Code Playgroud)
meta总是在计数中得到0.顺便说一句,我最初定义这样的元:
type meta = {
count: int
}
Run Code Online (Sandbox Code Playgroud)
我改为使用Automatic属性,因为我认为Newtonsoft.Json可能无法正确构造对象.
如果我的F#/ Windows版本在这种情况下有所不同,我只会为了完整性而感到惊讶:我正在尝试使用F#3.0 Repl(11.0.60315.1)并且我在Win7 x64上运行(SP1 )盒子.
因此,昨天在编写一些F#代码作为编码练习的一部分时,另一位开发人员指出了一些有趣的东西.我们只是快速编写一段代码来演示列表的总结.如果我做:
[1..100000] |> Seq.sum
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
System.OverflowException: Arithmetic operation resulted in an overflow.
at <StartupCode$FSI_0003>.$FSI_0003.main@()
Stopped due to error
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做:
[1..100000] |> List.reduce (+)
Run Code Online (Sandbox Code Playgroud)
我明白了:
val it : int = 705082704
Run Code Online (Sandbox Code Playgroud)
我意识到虽然这两段代码应该达到同样的目的,但它们却截然不同.我只是好奇有没有办法让List.reduce抛出OverflowException而不是给我一个错误的答案?
我正在为我维护的应用程序开发自动回归测试套件.在开发自动回归测试时,我遇到了一些几乎肯定是错误的行为.因此,就目前而言,我已经修改了自动回归测试,以便不记录失败 - 我的意思是故意允许这种不良行为.
所以,我对本网站上其他人的意见感兴趣.显然,我会在缺陷跟踪中添加一个错误,以确保修复此错误行为.但是,有任何令人信服的理由(无论哪种方式)要么改变回归测试以不断指出失败,要么让回归测试破裂并且在我们能够修复缺陷行为之前没有失败?我认为这是另外一种问题中的一种,但我在这里问,因为我认为其他人可能会看到不同的问题.
@Paul Tomblin,
只是要明确 - 我从未考虑过删除测试; 我只是考虑修改通过/失败条件以允许失败,而不是每次我运行测试时它都被扔到我的脸上.
我有点担心已知原因的重复失败最终会像C++中的警告一样被处理.我知道开发人员在他们的C++代码中看到警告并且忽略它们因为他们认为它们只是无用的噪音.我担心在回归套件中留下已知的失败可能会导致人们开始忽略其他可能更重要的失败.
顺便说一句,以免我被误解,我认为C++中的警告是制作强大代码的重要辅助,但从我见过的其他C++开发人员的判断来看,我认为我处于少数.
是否可以将结构嵌套在Clojure中的结构中?请考虑以下代码:
(defstruct rect :height :width)
(defstruct color-rect :color (struct rect))
(defn
#^{:doc "Echoes the details of the rect passed to it"}
echo-rect
[r]
(println (:color r))
(println (:height r))
(println (:width r)))
(def first-rect (struct rect 1 2))
;(def c-rect1 (struct color-rect 249 first-rect)) ;form 1
;output "249 nil nil"
(def c-rect1 (struct color-rect 249 1 2)) ;form 2
;output "Too many arguments to struct constructor
(echo-rect c-rect1)
Run Code Online (Sandbox Code Playgroud)
当然这是一个人为的例子,但有些情况下我想将大型数据结构分解为更小的子结构,以使代码更易于维护.由于注释表明如果我形成1,我得到"249 nil nil",但如果我做表格2,我得到"结构构造函数的参数太多".
如果我以错误的方式处理这个问题,请告诉我应该做什么.搜索Clojure google小组并没有为我提供任何帮助.
编辑:
我想我在问题陈述中并不像我想象的那样清楚:
1.)是否可以在Clojure中将一个结构嵌套在另一个结构中?(从下面判断,这是肯定的.)
2.)如果是这样,那么正确的语法是什么?(同样,从下面看,看起来有几种方法可以做到这一点.)
3.)当你有一个嵌套在另一个结构中的结构时,如何通过指定的键获取值?
我想我的示例代码并没有真正展示我想要做的很好.我在这里添加这个,以便其他人搜索这个可能更容易找到这个问题及其答案.
我正在尝试永远运行我的Phoenix应用程序,即独立于我的终端进程.我在Phoenix指南和Stackoverflow中看到了我可以使用的问题elixir --detached,但是我无法正确使用这些命令.事实上,我曾经能够像这样开始它,但我尝试了很多命令,我甚至不知道哪一个命令(也因为没有消息要说清楚).因此,使用最新版本的Phoenix(1.1)和Elixir(1.1.1),有哪些命令:1)永远启动服务器(作为守护进程); 2)停止服务器而无需重启服务器?