SLISC 库代码生成

                     

贡献者: addis

  • 本文处于草稿阶段。
预备知识 SLISC 库概述

   SLISC 中许多头文件(xxx.h)都是根据模板文件(xxx.h.in)生成的。如果你需要修改代码,那么一种方法是直接修改头文件。另一种是修改头文件的模板。模板文件的语法是 SLISC 库原创的。

   下面来看一个模板文件的例子:

代码 1:demo.h.in
#include <complex>
#include <vector>
using namespace std;
//% tem('add', {
//%  'vector<double>', 'Int', 'vector<float>';
//%  'vector<complex<double>>', 'vector<complex<double>>', 'vector<Int>';
//% });
//%----------------------------------
//% [Tz, Tx, Ty] = varargin{:};
void add(@Tz@ &z, const @Tx@ &x, const @Ty@ &y)
{
//% if is_vec(Tz) && is_vec(Tx) && is_scalar(Ty)
	for (size_t i = 0; i < z.size(); ++i)
		z[i] = x[i] + y;
//% elseif is_vec(Tz) && is_scalar(Tx) && is_vec(Ty)
	for (size_t i = 0; i < z.size(); ++i)
		z[i] = x + y[i];
//% elseif is_vec(Tz) && is_vec(Tx) && is_vec(Ty)
	for (size_t i = 0; i < z.size(); ++i)
		z[i] = x[i] + y[i];
//% else
//%     error('not implemented!');
//% end
}
//%-----------------------------------

   安装 octave 后,在命令行中用 $octave auto_gen.m,就会自动生成文件:

代码 2:demo.h
#include <complex>
#include <vector>
using namespace std;

void add(vector<double> &z, const Int &x, const vector<float> &y)
{
	for (size_t i = 0; i < z.size(); ++i)
		z[i] = x + y[i];
}

void add(vector<complex<double>> &z, const vector<complex<double>> &x,
        const vector<Int> &y)
{
	for (size_t i = 0; i < z.size(); ++i)
		z[i] = x[i] + y[i];
}

   观察一下很容易可以学会该模板的一些基础:


致读者: 小时百科一直以来坚持所有内容免费,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 10 元,我们一个星期内就能脱离亏损, 并保证在接下来的一整年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

                     

友情链接: 超理论坛 | ©小时科技 保留一切权利