Scala3-Macro系统Tasty进展

Scala3 重新设计Macro系统,这是官网英文原文
翻译的很烂,全当学习笔记而已,仅供参考

Or: Scala in a (Tasty) Nutshell

如何迁移到 Scala 3这篇博文中提到最大的一个问题是关于宏的问题。
目前我们正在努力将Tasty和macros对齐,接下来谈一谈我们的想法.

What is Tasty?

Tasty是Scala3的高级交换格式。它基于类型化的抽象语法树
这些树在某种意义上包含了Scala程序中的所有信息。
它们表示程序的语法结构,还包含有关类型和位置的完整信息.
Tasty在语法检查之后(这样所有的类型都显式的知道了,并且隐式的东西都已经解释过了)给代码做一个快照,
但是在快照之前不会经过任何转换,因此所有的信息都不会丢失。
放语法树的文件为了紧凑会压缩优化(有点像javascript的压缩),这意味着我们可以在任何编译器运行期间
生成完整的Tasty语法树,即便是单独编译也不依赖任何其他东西。

Scala 避坑大法

  • 单引号双引号是有区别的
    单引号表示:char字符
    双引号表示:string字符

  • scala 为什么不建议用return

    1. return是命令时语句,Scala鼓励函数式编程,函数式在描述关系,而不是高速计算机怎么做
    2. return会破坏Scala的类型推断,加上return 你得显式的声明返回类型
    3. return在有些情况下使返回含义模糊
    4. scala实际上并没有真正意义上的return语句,而是又抛出异常的语法糖包裹实现的
  • 如何定义一个无限长的序列 Infinite Stream
    无限长的序列有什么用

Scala 初探.四(sbt组织scala代码2)

package and import

1
2
3
4
5
6
7
├── build.sbt
└── src
└── main
└── scala
├── Interleave.scala
├── utils.scala
└── config.scala

对于同一目录下的两个文件,可以不用import,默认在一个package内

1
2
3
4
5
//Interleave.scala

class A {
val a = new ClassInUtils
}

Scala 初探.三(sbt组织scala代码1)

上一节我们用Makefile来组织scala代码,这里有更好的选择sbt来管理项目
sbt推荐将scala代码放在src路径,如下为标准的组织方式(代码还是原封使用第二节的样例代码)
总共3个文件

1
2
3
4
5
6
7
├── build.sbt
└── src
└── main
└── scala
├── a.scala
├── b.scala
└── c.scala

Scala 初探.一(main函数)

SCALA 程序的几种运行方式

方法1

脚本式的使用,scala a.scala 可正常打印

1
2
3
4
def main() = {
println("Hello, Scala way1")
}
main()

但这种写法不能被 scalac a.scala正确编译,可能JVM对象必须要有个main入口函数

Scala 初探.二(package组织方式)

多个文件的package组织方式

1
2
3
4
5
6
//a.scala 
package com.east
import com.west._
object objectMain extends App{
println("add Function from west used in east, 1+2=%d".format(Add.add(1,2)))
}