Krysztal's Language Scala

Krysztal's Language Scala

fabric-language-scala 的一个分支,但支持最新版本的 Scala3

基础库

Krysztal 的 fabric-language-scala 复刻版

Modrinth 版本

中文简体

这是 fabric-language-scala 的一个复刻版本,支持最新的 Scala3 版本。

为什么要复刻?

使用 Scala 的人数非常少,但 Scala 强大的表达能力使得该语言非常适合用于开发模组。

原版 fabric-language-scala 已经无人维护,维护者无法再投入更多精力来维护它,因此它逐渐变得无人维护且无法正常使用。

对 Scala3 的支持,几乎可以说是不存在的。

所以我决定复刻它并自行维护,同时实现与原版 fabric-language-scala 的兼容性,命名为 krysztal-language-scala。

注意

  • 此语言适配器将尽可能与上游内容同步,并尽可能确保可用性。
  • 如果你是开发者,请阅读 FOR_DEVELOPER,并提醒你的用户你使用的 Scala3 版本。
    • 我建议你尽可能使用最新版本。
  • 如果你是用户,请阅读 FOR_USER。

从 KLS 3.3.2 开始,编译目标是 Java 25。不支持较旧的 Java 运行时。

如何使用?

添加依赖

将以下内容添加到你的项目 build.gradle 中

plugins {
  ...
	id 'scala' // 为 gradle 添加 `scala` 插件
  ...
}

repositories {
  ...
	maven { url "https://api.modrinth.com/maven" }
  ...
}

dependencies {
  ...
	// Scala 3 语言支持(Fabric 语言适配器 + Scala 运行时,由该模组在运行时打包提供)。
	implementation("maven.modrinth:krysztal-language-scala:${property("krysztal_scala_version")}")
  ...
}

用法:class(类)

假设你的入口名称为 ExampleEntry.scala

import net.fabricmc.api.ModInitializer;

class ExampleEntry extends ModInitializer {
   lazy val logger = LoggerFactory.getLogger("KMMO")
   override def onInitialize(): Unit = {
       logger.info("Hi")
   }
}

然后在 fabric.mod.json 中

   ...
"entrypoints": {
   "main": [
     "dev.example.ExampleEntry"
   ],
 },
   ...

但得益于 Scala 与 Java 出色的互操作性,我们可以直接将其作为 Java 入口点使用 :)

用法:object(对象)

假设你的入口名称为 ExampleEntry.scala

import net.fabricmc.api.ModInitializer;

object ExampleEntry extends ModInitializer {
    lazy val logger = LoggerFactory.getLogger("KMMO")
    override def onInitialize(): Unit = {
        logger.info("Hi")
    }
}

然后在 fabric.mod.json 中

   ...
"entrypoints": {
   "main": [
     {
       "adapter": "scala",
       "value": "dev.example.ExampleEntry"
     }
   ],
 },
   ...

已知问题

未知的 invokedynamic bsm:scala/runtime*

此问题由 Scala 的类加载机制引起。

它几乎不会影响任何功能。请忽略它。