【Rust日报】2022-03-22 fluent-uri:一个快速、简单和严格的URI解析器

2022-04-18 15:26:45 浏览数 (1)

fluent-uri:一个快速、简单和严格的URI解析器

Announcing fluent-uri: a fast, easy and strict URI parser

简介

一个严格遵守IETF RFC 3986和RFC 6874的Rust URI解析器。

特性

  • 快速:零拷贝解析,据观察,比Rust中常见的URI解析器快2-25倍;
  • 简单:精心设计和文档良好的API;
  • 严格:解析RFCs中定义的所有可能的URI,并拒绝其他任何东西。

项目地址:https://github.com/yescallop/fluent-uri-rs

rename-future: 支持无dyn或box的命名Future

rename-future: Name anonymous Future from async fn without dyn or Box!

关于rename-future

由于当前编译器不支持关联类型的命名Future(解决命名impl Trait的type_alias_impl_trait特性还未稳定),想自定义命名Future需要依赖box和dyn特性;

rename-future提供了一种解决命名impl Future的思路:

代码语言:javascript复制
impl Service<Request> for AsyncFnService {
    type Response = ();
    type Error = ();
    type Future = FooAsyncFnFuture; // simply use renamed Future! no extra costs!

    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
        Poll::Ready(Ok(()))
    }

    fn call(&mut self, req: Request) -> Self::Future {
        foo()
    }
}

#[rename_future(FooAsyncFnFuture)]
async fn foo() -> usize {
    10
}

实现原理

代码语言:javascript复制
#[rename_future(AsyncFnFuture)]
async fn async_fn() -> usize {
    10
}

宏展开后生成代码如下:

代码语言:javascript复制
pub const fn __internal_async_fn_sof<F, Fut>(_: &F) -> usize
where
    F: Fn() -> Fut,
{
    std::mem::size_of::<Fut>()
}
pub const fn __internal_async_fn_aof<F, Fut>(_: &F) -> usize
where
    F: Fn() -> Fut,
{
    std::mem::align_of::<Fut>()
}
struct AsyncFnFuture(
    (
        [u8; __internal_async_fn_sof::<_, _>(&__internal_async_fn)],
        rename_future::Align<{ __internal_async_fn_aof::<_, _>(&__internal_async_fn) }>,
    ),
    std::marker::PhantomData<()>,
    std::marker::PhantomPinned,
);
async fn __internal_async_fn() -> usize {
    10
}
fn async_fn() -> AsyncFnFuture {
    impl std::future::Future for AsyncFnFuture {
        type Output = usize;
        fn poll(
            self: std::pin::Pin<&mut Self>,
            cx: &mut std::task::Context<'_>,
        ) -> std::task::Poll<Self::Output> {
            fn call_poll<__T, __Q, __F>(
                _: &__T,
                fut: std::pin::Pin<&mut __F>,
                cx: &mut std::task::Context<'_>,
            ) -> std::task::Poll<__F::Output>
            where
                __T: Fn() -> __Q,
                __Q: std::future::Future<Output = __F::Output>,
                __F: std::future::Future,
            {
                let fut: std::pin::Pin<&mut __Q> = unsafe { std::mem::transmute(fut) };
                fut.poll(cx)
            }
            call_poll::<_, _, _>(&__internal_async_fn, self, cx)
        }
    }
    unsafe { std::mem::transmute(__internal_async_fn()) }
}

注意

这个项目还没有经过很好的测试!不要在生产代码中使用这个库!

项目地址:https://github.com/ArtBlnd/rename-future

Rust的动态语言扩展?

Dynamic language extensions for Rust?

C语言程序员使用Lua来扩展他们应用程序的功能,Rust可以使用哪些类似的语言?

以下是一个可嵌入Rust代码中的脚本语言的汇总列表:

https://arewegameyet.rs/ecosystem/scripting/

mlua 0.8.0-beta.1: 首个支持Roblox Luau的版本

Announcing mlua 0.8.0-beta with Roblox Luau support

我很高兴地宣布第一个支持Roblox Luau的mlua 0.8.0-beta.1版本。

mlua为所有Lua版本(5.1-5.4)提供了统一的高级接口,包括LuaJIT和现在的Luau,并通过feature flags在它们之间进行简单切换。

Luau支持只在vendored模式下工作(不需要vendored特性标志),并提供所有关键的mlua特性,包括async/await和userdata值(通过仿真它们)。

同时,mlua实现了加载Luau模块的require函数,因为标准实现中没有这个功能。唯一值得注意的缺失功能是只读表和沙盒功能,这些功能将在下一个版本中得到支持。

简单使用:

代码语言:javascript复制
use mlua::prelude::*;

fn main() -> LuaResult<()> {
    let lua = Lua::new();

    let map_table = lua.create_table()?;
    map_table.set(1, "one")?;
    map_table.set("two", 2)?;

    lua.globals().set("map_table", map_table)?;

    lua.load("for k,v in pairs(map_table) do print(k,v) end").exec()?;

    Ok(())
}

rs-lisp:一个用Rust编写的小型lisp解释器

Tiny lisp interpreter

使用:

代码语言:javascript复制
cargo run [example.lisp]

项目地址:https://github.com/ktfth/rs-lisp

0 人点赞