小编Ric*_*ich的帖子

常见的Lisp SBCL循环性能调整

我正在使用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)

common-lisp

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

语言服务器语义标记

在语言服务器协议规范中,语义标记响应具有一个数据字段,该数据字段是标记的整数数组。

export interface SemanticTokens {
    /**
     * The actual tokens.
     */
    data: uinteger[];
}
Run Code Online (Sandbox Code Playgroud)

在所有示例中,语义标记都是在客户端使用 SemanticTokensBuilder 完成的,SemanticTokensBuilder 为每个标记类型指定行和列范围。你如何做服务器端?当VSCode发送“textDocument/semanticTokens/full”方法时,语言服务器返回什么?

visual-studio-code language-server-protocol

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

为什么我的自定义格式化程序实现忽略了宽度?

当我有一个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)

为什么忽略宽度?我需要做些什么?

formatting rust

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

如何使用 Rust 和 Actix web 和 WebSockets 发送服务器事件?

我正在将 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() 等从那里发送消息。但是,我需要跟踪上下文以便稍后发送消息。我怎么做?它作为参考传入,因此借用检查器不会让我对它做太多事情。

rust

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