我正在使用Project Euler问题5蛮力方法来测试性能调整CL代码。我是该语言的新手,想知道如何做这种事情。我编写了一个C实现,运行时间约为1.3秒。我最初的天真CL实施大约需要15秒。
这是我的初始CL代码
(defpackage :problem-5
(:use #:cl)
(:export :divides-even-p
:has-all-divisors
:smallest-multiple)
)
(in-package :problem-5)
(defun divides-even-p (num divisor)
(= 0 (rem num divisor))
)
(defun has-all-divisors (num start stop)
(loop for divisor from start to stop do
(cond
((not (divides-even-p num divisor)) (return-from has-all-divisors nil))
)
(+ divisor 1)
)
t
)
(defun smallest-multiple (n)
(do ((multiple 1 (+ multiple 1)))
((has-all-divisors multiple 1 n) (format t "~A" multiple))
))
(time (smallest-multiple 20))
Run Code Online (Sandbox Code Playgroud)
到目前为止,我所读到的技巧是1)优化速度和安全性,2)内联函数和3)显式设置变量类型。应用这些东西,我得到以下代码
(defpackage :problem-5
(:use #:cl)
(:export :divides-even-p …Run Code Online (Sandbox Code Playgroud) 在语言服务器协议规范中,语义标记响应具有一个数据字段,该数据字段是标记的整数数组。
export interface SemanticTokens {
/**
* The actual tokens.
*/
data: uinteger[];
}
Run Code Online (Sandbox Code Playgroud)
在所有示例中,语义标记都是在客户端使用 SemanticTokensBuilder 完成的,SemanticTokensBuilder 为每个标记类型指定行和列范围。你如何做服务器端?当VSCode发送“textDocument/semanticTokens/full”方法时,语言服务器返回什么?
当我有一个Display实现的枚举并且尝试将其打印为格式化格式时,我给它的宽度将被忽略。
use std::fmt;
enum TestEnum {
A,
B,
}
impl fmt::Display for TestEnum {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
TestEnum::A => write!(f, "A"),
TestEnum::B => write!(f, "B"),
}
}
}
fn main() {
println!("-{value:>width$}-", value = TestEnum::A, width = 3);
}
Run Code Online (Sandbox Code Playgroud)
我希望它能输出- A-,但它能输出-A-。
如果我将值替换为实际的字符串而不是枚举,那么它做对了,
println!("-{value:>width$}-", value = "A", width = 3);
Run Code Online (Sandbox Code Playgroud)
输出
- A-
Run Code Online (Sandbox Code Playgroud)
为什么忽略宽度?我需要做些什么?
我正在将 Rust 与 Actix web 一起使用,并希望将 WebSockets 用于服务器事件,主要是发送到客户端的状态消息。我遵循了基本结构,
struct StatusWS {}
impl Actor for StatusWS {
type Context = ws::WebsocketContext<Self>;
fn started(&mut self, ctx: &mut Self::Context) {
// How to keep track of ctx???
}
}
Run Code Online (Sandbox Code Playgroud)
当客户端连接时,started() 被调用,我可以使用 ctx.text() 等从那里发送消息。但是,我需要跟踪上下文以便稍后发送消息。我怎么做?它作为参考传入,因此借用检查器不会让我对它做太多事情。