小编Joh*_*son的帖子

clojure.spec中的禁用键

我正在关注clojure.spec指南.我知道在使用clojure.spec/keys时可以声明必需和可选属性.

我不明白可选的意思.对我来说:opt不做任何事情.

(s/valid? (s/keys :req [:my/a]) {:my/a 1 :my/b 2}) ;=> true

(s/valid? (s/keys :req [:my/a] :opt []) {:my/a 1 :my/b 2}) ;=> true
Run Code Online (Sandbox Code Playgroud)

指南承诺向我解释这个问题,"我们稍后会看到可选属性可能有用",但我找不到解释.我可以申报禁用钥匙吗?或者以某种方式声明有效键的集合等于以下键:req和:opt?

clojure clojure.spec

11
推荐指数
1
解决办法
1140
查看次数

F#和静态检查的联合案例

很快我和我的兄弟Joel将发布Wing Beats的 0.9版本.它是用F#编写的内部DSL.有了它,您可以生成XHTML.其中一个灵感来源是Ocsigen框架的XHTML.M模块.我不习惯OCaml语法,但我确实理解XHTML.M以某种方式静态检查元素的属性和子元素是否是有效类型.

我们无法在F#中静态检查相同的内容,现在我想知道是否有人知道如何做到这一点?

我的第一个天真的方法是将XHTML中的每个元素类型表示为一个联合案例.但遗憾的是,您无法静态限制哪些案例作为参数值有效,如XHTML.M中所示.

然后我尝试使用接口(每个元素类型为每个有效父类实现一个接口)和类型约束,但是我没有设法使它工作而不使用显式转换,使得解决方案使用起来很麻烦.无论如何,它并不像一个优雅的解决方案.

今天我一直在寻找Code Contracts,但它似乎与F#Interactive不兼容.当我按下alt +输入它冻结.

只是为了让我的问题更加清晰.这是一个同样问题的超简单人工例子:

type Letter = 
    | Vowel of string
    | Consonant of string
let writeVowel = 
    function | Vowel str -> sprintf "%s is a vowel" str
Run Code Online (Sandbox Code Playgroud)

我希望writeVowel只能静态接受元音,而不是如上所述,在运行时检查它.

我们怎样才能做到这一点?有谁有想法吗?必须有一个聪明的方法来做到这一点.如果没有工会案例,可能还有接口?我一直在努力解决这个问题,但我被困在盒子里,无法想到它.

html f# code-contracts

7
推荐指数
1
解决办法
424
查看次数

RequireJS订单插件和Dojo 1.7.1

我正在使用AMD和RequireJS将项目从Dojo 1.6.1升级到带有新AMD加载器的Dojo 1.7.1.我必须处理旧的JavaScript文件,而不是作为AMD模块编写,并且必须以正确的顺序加载它们.

在我使用RequireJS订单插件之前,它似乎不适用于Dojo AMD Loader.我在loader文档或Dojo Build System文档中找不到任何相关内容.

有什么想法吗?如果没有订单插件,我应该如何与Dojo 1.7一起处理纯JavaScript文件?我是否需要单独处理它们,或者在加载器或构建系统中是否有这方面的功能?

javascript dojo requirejs js-amd

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

不寻常的对象定义

我偶然发现了这个奇怪的物体声明.

var config = {};
{ 
  config.foo = 'foo';
  config.bar = 'bar';
};
Run Code Online (Sandbox Code Playgroud)

它有效,但我猜它不会.

困惑我在Chrome DevTools中打开控制台,然后输入:

var a = {};
// => undefined
Run Code Online (Sandbox Code Playgroud)

到目前为止没什么奇怪的.但后来我输入:

{ a.b = 'b'; }
// => Uncaught SyntaxError: Unexpected token .
Run Code Online (Sandbox Code Playgroud)

好吧,嗯......这不应该有用吗?另一种尝试,没有单独评估报表:

var a = {}; {a.b = 'b'};
// => "b"
Run Code Online (Sandbox Code Playgroud)

嗯,没有抛出SyntaxError.如果我评估一个,我可以看到它是按照我的意图定义的.

a;
// => Object {b: "b"}
Run Code Online (Sandbox Code Playgroud)

怎么了?我试图谷歌它,但我不知道要搜索什么,我缺乏某种知识来弄清楚发生了什么.有人可以解释一下吗?

javascript

3
推荐指数
1
解决办法
76
查看次数

在实现接口的非泛型方法中对泛型的模式匹配

我有一个令人沮丧的问题.我正在ASP.NET MVC中构建一个视图引擎,并正在实现接口IViewEngine.在其中一种方法中,我试图动态地找出视图结果的类型.有时结果是模板(类型为Template <'key>).密钥用于在模板中定位占位符,其目的是使用区分联合,可能对每个网站都是唯一的.它可能看起来像这样:

type MasterKey = | HeadContent | HeaderContent | MainContent | FooterContent
let MasterTemplate : Template<MasterKeys> = ...
Run Code Online (Sandbox Code Playgroud)

现在,问题是这样的:因为我正在实现一个接口,所以我无法控制方法签名.由于我无法添加泛型类型参数,因此'a'将转换为obj,而下面的模板将不匹配:

   match result with
   | :? foo -> ...
   | :? bar -> ...
   | :? Template<'a> -> ...
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

f# pattern-matching

2
推荐指数
1
解决办法
1325
查看次数