我正在学习Clojure.我写了这段代码来递归遍历一个目录.
(tree-seq #(.isDirectory %1) #(.listFiles %1) (File. "/my-directory"))
Run Code Online (Sandbox Code Playgroud)
为什么我不能.isDirectory在Clojure中用作一流函数?有没有更好的方法来重写此代码?
我在Clojure中查看java代码.我发现缩进对我来说很奇怪.
我已经习惯了http://www.oracle.com/technetwork/java/javase/documentation/codeconventions-136091.html#262的缩进风格.大多数IDE都以这种方式配置了自动格式化.为什么Clojure不遵循这种风格?
更新:
我的意思是用java实现的Clojure部分,例如https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/ARef.java
我认为Scala中的"对象"非常类似于Java中的Singleton,这被认为不是一个好的设计实践.单身对我来说就像定义全局变量的另一种方式是BAD.我写了一些这样的Scala代码,因为它很简单并且可以工作,但代码看起来很难看:
object HttpServer { // I'm the only HttpServer instance in this program.
var someGlobalState: State
def run() {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
我试图避免这样做.什么时候定义Scala对象好?
std::shared_ptr需要在堆上分配一个控制块来保存引用计数.我从http://ootips.org/yonat/4dev/smart-pointers.html学到了另一种方法,它将所有引用保存在双向链表中.它不需要额外的分配也不需要计数器,但参考对象本身更大.
有没有基准或任何明确的理由表明一个实施比其他实施更好?
这可以原子地完成吗?
void load_and_store(int* dst, int* src) {
int data = *src;
*dst = data;
}
Run Code Online (Sandbox Code Playgroud)
如果必须完成原子存储XCHG [addr], EAX,我将不得不首先加载数据EAX.然后加载和存储不是原子的.
gcc原子扩展void __atomic_store (type *ptr, type *val, int memmodel)看起来像能够以原子方式加载和存储.
如何告诉emacs以与Windows或Mac相同的方式工作,如果我选择一个区域并开始输入,该区域将在插入新文本之前删除?
在Java中,可以通过Class.forName("com.my_pkg_name.MyClass")返回类类型来完成.
似乎Go反射只能找到Type by Value但不允许Name为Type.在实现与Go代码交互的脚本语言解释器时,此功能非常有用.
假设我们有一个像这样的城市的州(varchar),城市(varchar)和人口(int)表,
New York, New York, 8175133
Los Angeles, California, 3792621
Chicago, Illinois, 2695598
San Diego, California, 1307402
Run Code Online (Sandbox Code Playgroud)
我想选择人口最多的每个州的城市.结果是,
New York, New York, 8175133
Los Angeles, California, 3792621
Chicago, Illinois, 2695598
Run Code Online (Sandbox Code Playgroud)
如何编写SQL来做到这一点?
更新:
让我说清楚:结果应该包含每个州人口最多的一个城市.在上面的例子中,"圣地亚哥"的人口比"洛杉矶"少,所以它不会出现在结果中.
我有多个线程从一个标记为 final 的共享数组访问元素(我永远不会尝试为它分配另一个数组)。我需要同步任何东西吗?我可以假设对元素的读/写是原子的吗?
(map (fn [x] (func 1 2 x)) [0 1 2])在哪里func需要3个参数可以写(map #(func 1 2 %) [0 1 2])为简短.是否有可能使它更简洁?就像在OCaml中一样,(func 1 2)它本身就是一个功能.我不需要创建一个新的并将其传递给map.
我想在条件表达式中定义变量,以便变量范围在if子句中.这工作正常,
if (int* x = new int(123)) { }
当我试图用map :: iterator做类似的事情时,
if ((map<string, Property>::iterator it = props.find(PROP_NAME)) != props.end()) { it->do_something(); }
我有 error: expected primary-expression before ‘it’
什么区别int*和map::iterator?
例如,在Web爬网程序中,它维护一组全局访问URL.一旦工作人员开始处理URL或已完成URL,其他工作人员不应使用相同的URL.在Java中实现这一点的一种方法是将访问过的URL放在一个ConcurrentHashMap(一个Set可能更好).每个工作人员在访问URL之前都会查看地图
if (visited.putIfAbsent(url, true) == null) {
crawl(url);
} else {
// do nothing
}
Run Code Online (Sandbox Code Playgroud)
在Clojure中,我使用了一个集合atom.每次我要使用最新访问过的URL交换新集时,交换函数应该检查集合是否已经具有此URL.如果URL存在,那么工作人员应该从那里停止.为了能够告诉工作者交换是否成功,我必须将返回值保存在全局状态中[visited-urls last-swap-succeeded]
(def state (atom [#{} nil]))
(defn f [state key] (let [[visited-urls l] state] (if (visited-urls key) [visited-urls false] [(conj (visited-urls key) true]))))
Run Code Online (Sandbox Code Playgroud)
工人应该这样做
(when (second (swap! state f url)) (crawl url))
Run Code Online (Sandbox Code Playgroud)
它起作用,但对我来说看起来很难看.问题是交换功能不允许返回呼叫站点的值.在Clojure中有更好的方法吗?
我们有一个小团队使用IntelliJ IDEA作为Java IDE并使用git管理我们的源代码.IDEA项目是基于目录的格式创建的.我发现下面的一些文件.idea与用户有关.
是否有可以过滤的用户相关文件的完整列表.gitignore?