(let [ truthys (filter #(filter-func %) coll)
falsys (filter #(not filter-func %) coll)]
这段代码遍历 coll 两次,并对每个元素应用两次 filter-func。我想知道,有没有办法一次性将 coll 过滤到 truthys 和 falsys 中?
(let [ truthys (filter #(filter-func %) coll)
falsys (filter #(not filter-func %) coll)]
这段代码遍历 coll 两次,并对每个元素应用两次 filter-func。我想知道,有没有办法一次性将 coll 过滤到 truthys 和 falsys 中?
user=> ((fn [x] x) 5)
5
user=> (#(%) 5)
Execution error (ClassCastException) at user/eval1576$fn (REPL:1).
class java.lang.Long cannot be cast to class clojure.lang.IFn (java.lang.Long is in module java.base of loader 'bootstrap'; clojure.lang.IFn is in unnamed module of loader 'bootstrap')
我原本以为这两个匿名函数是等效的。但在第二种情况下,我遇到了错误:匿名函数的求值结果为(5)
,这会产生完全相同的错误。
但是,为什么在第一种情况下我没有收到此错误? 有什么区别?
我有一个文本文件中的数据,格式如下:
1 2
3 4
5 6
7 8
9 0
我想为每一列创建一个列表,因此:
((1 3 5 7 9) (2 4 6 8 0))
我实际上已经想出了一个可行的解决方案:
(defn make-lists []
(let [lines (clojure.string/split-lines (slurp "input"))]
(let [l1 (map #(parse-long (first (clojure.string/split % #" "))) lines)
l2 (map #(parse-long (nth (clojure.string/split % #" ") 3)) lines)]
(list l1 l2))))
但是,我认为这个解决方案存在一些问题。我实际上并不清楚map
其内部是如何工作的,但我担心这会导致对输入进行两次迭代,而理论上一次迭代就足够了。
不幸的是,输入数据中每行的两个值之间有多个空格。并且clojure.string/split
每个空格都会产生一个结果。因此,我nth 3
在代码中随意查找 l2,我想摆脱它。
我很感激任何关于如何改进此代码的想法。
这是一个最小的可重现示例:
#include <memory>
#include <SFML/Graphics.hpp>
class Label
{
public:
Label(sf::String msg, float y)
{
if (!font.loadFromFile("arial.ttf"))
{
printf("Error loading font!\n");
}
text.setString(msg);
text.setPosition(0, y);
}
sf::Font font;
sf::Text text = sf::Text("Label", font, 40);
};
int main()
{
sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window");
// label is a local variable
Label label1 = Label("Label1", 0);
// label is inside a pointer
std::unique_ptr<Label> label2 = std::make_unique<Label>("Label2", 50);
struct Labelstruct
{
Label label;
};
// label is inside a struct
struct Labelstruct label3 = { Label("Label3", 100) };
// label is inside a struct inside a pointer:
std::unique_ptr<Labelstruct> label4 = std::make_unique<Labelstruct>(Label("Label4", 150));
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
window.draw(label1.text);
window.draw(label2->text);
window.draw(label3.label.text);
window.draw(label4->label.text);
window.display();
}
return EXIT_SUCCESS;
}
解释:该类Label
包装了一个sf::Text
。然后我使用四种不同的方法来初始化和绘制它:
“Label4” 未绘制。我可以看到标签应该出现的点:
为什么指向结构体的指针会导致这个问题?
为了您的方便,这是我用来编译该东西的命令:
g++ test.cc -std=c++20 -lsfml-window -lsfml-system -lsfml-graphics
FetchContent 的官方文档看起来更像是一个概述。但我正在寻找完整的参考。cmake --help-module FetchContent
产生与上述链接相同的文本。
在某些项目中我看到了这种情况,例如:GIT_SHALLOW TRUE
。在这种情况下:
FetchContent_Declare(
box2d
GIT_REPOSITORY https://github.com/erincatto/box2d.git
GIT_TAG 7b273b12409252d247b89940d29a8aab0386f570
GIT_SHALLOW TRUE
GIT_PROGRESS TRUE
)
我想查看它的文档。其他的想法我也没找到文档。