小编Ant*_*ald的帖子

迭代两个变量的所有排列

我需要调用以下函数cross4次,对于xy变量的所有排列,值为1和-1;

我的方法:

var p = [-1, 1];

p.forEach(function(x) {
  p.forEach(function(y) {
    cross(x, y);
  });
});
Run Code Online (Sandbox Code Playgroud)

有没有更短的方法这样做?

javascript

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

为什么必须要求一些原生的clojure命名空间,而有些则不需要

简单的标题是:

我为什么要这样做

(require 'clojure.edn)
Run Code Online (Sandbox Code Playgroud)

为了使用例如:

(clojure.edn/read-string "9")
Run Code Online (Sandbox Code Playgroud)

为什么我可以立即调用:

(clojure.string/join (range 4) "-")
Run Code Online (Sandbox Code Playgroud)

clojure

5
推荐指数
2
解决办法
96
查看次数

Fish shell 中用户和 root 具有相同的别名和功能

如何使root 用户也可以使用中 定义的别名~/.config/fish/config.fish和 中 定义的函数?~/.config/fish/functions

符号链接到/root/.config/fish没有完成这项工作。此外,我还希望能够通过 来使用我的函数和别名sudo,但目前该功能和别名无法正常工作。

你们是怎么做到的?

fish

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

Garden 在 Reagent's Hiccup 中生成内联样式

在试剂中,可以像这样指定内联 CSS 样式:

[:div {:style {:border "1px solid red"}} "My Text"]
Run Code Online (Sandbox Code Playgroud)

花园可以使包含列表中多个值的此类 CSS 属性更加通用。逗号分隔列表的向量和空格分隔列表的嵌套向量(此处使用):

(require '[garden.core :refer [style]])

(style {:border [[:1px :solid :black]]})
;= "border: 1px solid red;"
Run Code Online (Sandbox Code Playgroud)

如何将这些东西结合起来?试剂似乎很固执,只接受样式属性的哈希映射。在这里接受一个字符串也是一个解决方案。

一般来说,从长远来看,内联样式不是一个好的选择。因此,可以通过将类附加到div并通过花园css函数全局指定其样式来解决该问题。

类示例:

[:div.myclass "My Text"]

(css [:.myclass {:border [[:1px :solid :black]]}])
;= ".myclass {\n  border: 1px solid black;\n}"
Run Code Online (Sandbox Code Playgroud)

然而,有时从内联样式开始是很好的,所以:有没有办法按照上面描述的方式做到这一点?

clojure hiccup clojurescript reagent

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

用clojure.spec解析

(require '[clojure.spec :as s])
Run Code Online (Sandbox Code Playgroud)

考虑以下数据:

(def data {:names [["Anna"      :lucky]
                   ["Peter"]
                   ["Jon"       :lucky]
                   ["Andre"     :lucky]]})
Run Code Online (Sandbox Code Playgroud)

它是一个带有一个键的哈希映射:具有向量向量值的名称.内部向量必须包含一个字符串作为第一个元素,并且可以选择包含关键字:lucky作为第二个元素.

前两个句子应该描述clojure.spec- 让我们从向量中的项目开始:

(s/def ::item (s/cat :name string? :lucky (s/? #(= :lucky %))))

(s/conform ::item ["Tom"])
;; {:name "Tom"}
(s/conform ::item ["Tom" :lucky])
;; {:name "Tom", :lucky :lucky}
(s/conform ::item ["Tom" :sad])
;; :clojure.spec/invalid
Run Code Online (Sandbox Code Playgroud)

这有效.但是,如果只有一个选项.解析后的结果不会像这样更好:

`{:name "Tom", :lucky true}` or `{:name "Tom", :lucky false}`
Run Code Online (Sandbox Code Playgroud)

这可以在clojure.spec中完成吗?

有了这个,人们就可以继续:

(s/def ::items (s/coll-of ::item '()))

(s/conform ::items [["Tom" :lucky] ["Tim"]])
[["Tom" :lucky] ["Tim"]]
Run Code Online (Sandbox Code Playgroud)

但是,看起来它通过了测试,但为什么这些项目不再被解析?

编辑: 这可以通过从alpha7切换到alpha10版本来解决,其中coll-of只接受一个参数

最后我的规范看起来像前面所述的警告: …

clojure clojure.spec

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

使用mapM保留懒惰

考虑以下简单的IO功能:

req :: IO [Integer]
req = do
  print "x"
  return [1,2,3]
Run Code Online (Sandbox Code Playgroud)

实际上,这可能是一个http请求,它在解析结果后返回一个列表.

我试图以懒惰的方式连接该函数的几个调用的结果.

简单来说,以下内容应仅打印'x'两次:

fmap (take 4) req'
--> [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

我认为这可以用sequence或者解决mapM,但是我的方法在懒惰方面失败了:

import Control.Monad

req' :: IO [Integer]
req' = fmap concat $ mapM req [1..1000] -- should be infinite..
Run Code Online (Sandbox Code Playgroud)

这会产生正确的结果,但是IO函数req被调用1000次而不是必需的2次.当使用无限列表上的映射实现上述内容时,评估根本不会终止.

monads haskell

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

clojure spec:包含a:with或a:height(XOR)的地图

以下clojure规范::my允许具有键:width或key:height的映射,但是它不允许同时具有以下两者:

(s/def ::width int?)

(s/def ::height int?)

(defn one-of-both? [a b]
  (or (and a (not b))
      (and b (not a))))

(s/def ::my (s/and (s/keys :opt-un [::width ::height])
                   #(one-of-both? (% :width) (% :height))))
Run Code Online (Sandbox Code Playgroud)

即使它完成了这项工作:

(s/valid? ::my {})
false
(s/valid? ::my {:width 5})
true
(s/valid? ::my {:height 2})
true
(s/valid? ::my {:width 5 :height 2})
false
Run Code Online (Sandbox Code Playgroud)

代码看起来并不简洁.首先,将键定义为可选,然后根据需要定义.有没有人对此有更可读的解决方案?

clojure clojure.spec

5
推荐指数
2
解决办法
763
查看次数

函数内部的JavaScript函数,而不是每次都重新声明它

可以在javascript中声明函数内部的函数.喜欢:

function my(){
   function check(){
      return true;
   }

   console.log( check() ? "yes" : "no");
}

my();
Run Code Online (Sandbox Code Playgroud)

但是,它可能不是最快的,因为每次调用时,都必须重新声明check.但在我之外宣布检查会污染全球范围.

如果是构造函数My,可以将check添加到其原型中,但不幸的是,这不适用于普通函数.

解决这个问题的便捷方法是什么?

javascript functional-programming

4
推荐指数
1
解决办法
65
查看次数

在clojure/ClojureScript中进行stringify/parse edn

在JavaScript中,可以将js数据结构转换为JSON字符串

JSON.stringify({somedata: { somesubdata: {}}})
Run Code Online (Sandbox Code Playgroud)

在其他地方,人们可以再次将其解析为JS数据结构

var my_obj = JSON.parse("{"somedata":{"some_subdata":{}}}");
Run Code Online (Sandbox Code Playgroud)

对于edn格式,Clojure/ClojureScript中的等价物是什么?

我想在ClojureScript前端字符串化一些数据并在Clojure后端解析它.(反之亦然)

javascript clojure clojurescript

4
推荐指数
1
解决办法
1348
查看次数

制作非零条目列表

说我有这样的功能:

(defn my-f [a & [b]]
   (if (nil? b)
      (my-other-f a)
      (my-other-f a b)))
Run Code Online (Sandbox Code Playgroud)

这当然是一种简化。它是另一个函数的包装函数——实际上 a 是在这个函数内部处理的。如果可选参数 b 没有传递给 my-f,它也不应该传递给 my-other-f。

我正在考虑另一种方法来实现这一目标:

(defn my-f [a & [b]]
   (apply my-other-f (make-list-of-not-nil-entries a b)))
Run Code Online (Sandbox Code Playgroud)

是否有内置功能可以完成这项工作?


例子

有时,过于抽象会令人困惑,所以我在这里提供真实案例。以下 ClojureScript 代码有效,其目的显然是尝试不同的浏览器特定选项,以便从 HTML 画布元素获取“webgl”上下文。

(defn create-ctx [canvas & [options]]
  (some (if options
          #(.getContext canvas % (clj->js options))
          #(.getContext canvas %))
        ["webgl" "experimental-webgl" "webkit-3d" "moz-webgl"]))
Run Code Online (Sandbox Code Playgroud)

给定的 Canvas 元素的方法 getContext 实际上等待一个参数,以及另一个可选的参数。上述包装函数具有相同的数量。

我只是想看看,是否有一种快速的方法来避免 1 和 2 arity 函数调用的显式切换。

clojure clojurescript

4
推荐指数
1
解决办法
2115
查看次数