当前位置: 首页 > 面试题库 >

Scala,Maven和预处理器

鲜于河
2023-03-14
问题内容

我知道反对Java中的预处理器和宏的所有哲学观点。我不同意仅仅因为某些人可能滥用某种语言功能,就应该将其排除在所有人之外。

我想在Java和Scala代码中包含__FILE____LINE__宏,以进行有效的日志记录。由于对运行时性能的影响,对Exception的任何使用都是不可接受的。那些认为可以在“生产代码”中关闭日志记录的人应该留意Brian
Kernighan的建议:

删除错误消息“现在程序正在运行”,就像将降落伞戴在地上一样,但是一旦升空就将其取下。

这些宏是否有可能融入到语言中?如果没有,有什么办法可以使用Maven运行像m4这样的预处理器吗?

谢谢。


问题答案:

更新
@ralph嗯,这是2年前的问题了,但是由于我有同样的需求__LINE____FILE__而您提到了SCALA;这是我使用Scala宏(从
v2.10.0-RC1开始 )的一些想法。

def $currentPosition:String = macro _currentPosition;
def _currentPosition(c:Context):c.Expr[String]={ import c.universe._;
  val pos = c.enclosingPosition;
  c.Expr(Literal(Constant(
    s"${pos.source.path}: line ${pos.line}, column ${pos.column}" )))
}

在被评价的宏 编译时$currentPosition被替换为描述其在源代码位置的文字串。例如,println在第13行放一个,它显示:

/sandbox/tmp_juno_workspace2/LogMacro_Test/src/test/Trial.scala: line 13, column 15

我没有广泛地使用这些机制,但是通过进行调整,可以开发他需要的日志记录功能(我应该补充一点,编写宏可能很困难-对我来说!)。



 类似资料:
  • 结果如下: 我可以做什么来使这个返回'somefunc_linux'?。Clang似乎做得很对,顺便说一句。

  • 在 webpack 中,所有的预处理器需要匹配对应的 loader。vue-loader 允许你使用其它 webpack loader 处理 Vue 组件的某一部分。它会根据 lang 属性自动推断出要使用的 loader。 CSS 例如,使用 Sass 编译我们的 <style> 语言块: npm install sass-loader node-sass --save-dev <style

  • 得益于 vue-loader, 我们可以通过 lang 属性在组件中的<template>, <script> 或 <style> 上使用各种预处理器。 举个例子,我们在 pages/index.vue 组件中使用 Pug, CoffeeScript 和 Sass: <template lang="pug"> h1.red Hello {{ name }}! </template> <scr

  • 这个模板已经预设设置大部分流行的css预处理器,包括 LESS, SASS, Stylus, 和 PostCSS。要使用一个预处理器的话 ,所有你需要做的就是安装相应的webpack loader。例如,使用SASS: npm install sass-loader node-sass --save-dev 你需要安装node-sass,因为saas-loader需要这个依赖项 在组件里面使用预

  • WebGL着色器语言和C语言一样提供了一些用于预处理的命令#define、#include、#if等以#号开头的命令。 宏定义#define 注意宏定义和着色器声明的变量不同,着色器程序执行前需要进行编译处理,着色器程序编译处理之后程序才会在GPU上执行,宏定义主要是在编译处理阶段起作用。比如宏定义#define PI 3.14,PI符号表示圆周率3.14,如果在代码return float f

  • 在Webpack中,所有预处理器都需要应用相应的加载器。 vue-loader允许你使用其他Webpack加载器处理Vue组件的一部分。它将从语言块的lang属性自动推断出要使用的正确加载器。 CSS 例如,让我们用SASS编译我们的<style>标签: npm install sass-loader node-sass --save-dev <style lang="sass"> /* 在