小编Mat*_*teo的帖子

在Clojure中的一厢情愿

在Scheme I中我习惯做这样的事情

(define (f x) (g x))
(define (g x) (+ x 42))
(g 0)
Run Code Online (Sandbox Code Playgroud)

也就是说,我习惯用其他瞬间无界函数来定义函数.为什么在Clojure中不可能这样做?例如,在Clojure REPL上,以下内容无效

(defn f [x] (g x))
(defn g [x] (+ x 42))
(g 0)
Run Code Online (Sandbox Code Playgroud)

lisp scheme clojure

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

如何检查哈希表中的每个值是否满足Common Lisp中的谓词

我有一个哈希表 (setf ht (make-hash-table)) 里面包含了一些项目,例如(setf (gethash 'first ht) 'first-value),(setf (gethash 'second ht) 'second-value),...

此外,我有一个testarity 的谓词,评估为TNIL.我想检查哈希表的所有第一个条目是否ht满足test谓词.例如,如果哈希表只包含上面给出的两个条目,我想知道它的评估(and (test 'first) (test 'second)).有一个简单的方法吗?

hashtable common-lisp

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

csi和csc之间的差异(Chicken Scheme)

为什么函数compose在解释器中csi而不是在编译器中定义csc?我知道我可以很容易地自己定义它,但我只是想知道为什么会有这样的差异.

scheme chicken-scheme

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

Lisp中的算术

如果我尝试(expt 123456 123456)在Chicken Scheme(使用数字扩展名)和Clisp中评估表达式,则需要相当长的时间(在Clisp中更多).所以,我认为,评估的表达(/ (expt 123456 123456) (expt 123456 123456))至少需要两倍的时间,因为解释必须评估两倍的电源功能,然后必须评估师.但是,令人惊讶的是,两位口译员的答案几乎是瞬间出现的.到底是怎么回事?怎么可能?确切地说,这个表达式是如何评估的?

lisp math scheme common-lisp

2
推荐指数
3
解决办法
437
查看次数

使用reduce避免clojure中的StackOverflowError

简单的代码

(reduce concat (take 10000 (repeat '(1))))
Run Code Online (Sandbox Code Playgroud)

导致StackOverflowError.假设我有一个很大的列表列表,就像我在这个例子中获得的列表一样take.我怎么能在我尝试的时候将它们合并到一个列表中?

clojure

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

改善clojure功能

我有一个同类的地图列表,如下所示

({:x 1 :y 2} {:x 3 :y 5} {:x 1 :y 7} {:x 2 :y 0} {:x 3 :y -1})
Run Code Online (Sandbox Code Playgroud)

我想:y用相等的值来对这些对的值求和:x.我的意思是,我想要一个函数y-adder,如果应用于前面的列表给出列表(顺序无关紧要,它可以是一个集合而不是列表)

({:x 1 :y 9} {:x 3 :y 4} {:x 2 :y 0})
Run Code Online (Sandbox Code Playgroud)

我写的是以下内容:

(defn y-adder [Ps]
  (let [xs (set (map :x Ps))]
   (let [y+ (fn [v] (apply + (map :y (filter #(= (:x %) v) Ps))))]
    (map #(hash-map :x % :y (y+ %)) xs))))
Run Code Online (Sandbox Code Playgroud)

它有效,但对于这么简单的任务来说似乎过于复杂.所以我想知道是否有更简单(也许更有效)的解决方案.

clojure

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

流的收集方法无法按预期工作

我正在测试collect流的方法。在这段代码中,我试图通过StringBuilder在第一种情况下使用 a并String在第二种情况下使用连接来从字符串流构建单个字符串。我不明白为什么第二种情况会产生一个空字符串。

    String[] strs = new String[] {"aaaaa", "bbbbbbb", "c", "dd"};
    
    
    StringBuilder sb = Arrays.stream(strs).collect(StringBuilder::new, StringBuilder::append, StringBuilder::append);
    
    System.out.println(sb);
    
    
    String s = Arrays.stream(strs).collect(String::new, String::concat, String::concat);
    
    System.out.println(s);
Run Code Online (Sandbox Code Playgroud)

java collect java-stream

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