各编程语言 + aardio 相互调用示例
Python .Net Java C++ PowerShell 代码简单、复制可用。aardio 快速调用 C,C++,C#,Java,R,V,Python,JavaScript,Node.js,Rust,PHP,Ruby,PowerShell,Fortran,Delphi,Julia,Nim,批处理 …… 演示。
《aardio 编程语言快速入门 —— 语法速览》
aardio 直接调用系统 API 函数( 支持回调、相互调用 ):
var ret,point = ::User32.GetCursorPos({int x;int y;})aardio / JavaScript 相互调用( 支持 ES6 ):
import web.script;var vm = web.script("ES6")
//导出 aardio 函数到 JavaScriptvm.external = {log = function(...){
console.log(...)}}
vm.script = /*****function TestFunction(a,b) {return a + b;}*****/
var ret = vm.script.TestFunction(2,3);在 aardio 中调用 Python( Python 调用 aardio 同样简单,参考 aardio 自带范例),简单得就像在 Python 中使用 Python:
import console;import py3;
//导入 Python 模块。var itertools = py3.import("itertools")
//调用 Python 函数,支持纯 aardio 类型参数 var permutations = itertools.permutations({"a","b","c"});
//调用 Python 内置函数 listvar pyList = py3.list(permutations);
//遍历 Python 对象成员 for( item in pyList.each() ){console.log(item); //像 aardio 对象一样使用 Python 对象}
console.pause();aardio 直接调用 .Net / C# 组件( 支持相互调用,支持委托这些)
import win.ui;var winform = win.form(text="DataGridView")
import System.Data;var tab = System.Data.DataTable("DT");tab.Columns.Add("名称");tab.Rows.Add({"WangWu"});
import System.Windows.Forms;var grid = System.Windows.Forms.CreateEmbed("DataGridView",winform);grid.ColumnHeadersHeightSizeMode = 2;grid.DataSource = System.Data.DataView(tab);
winform.show();win.loopMessage();aardio 直接调用 Java ( 也支持相互调用 )
import java;var jvm = java();
//加载 Java 类对象 HelloworldApp = jvm.import("aardio.sample.HelloworldApp");
//也可以如下自内存或文件直接加载类,HelloworldApp = jvm.import("aardio.sample.HelloworldApp",$"\java\aardio\sample\HelloworldApp.class");
//用 Java 类创建 Java 对象 var helloworld = HelloworldApp();
//直接调用 Java 对象的方法 var result = helloworld.test(3);用 aardio 编译 C 语言代码生成 DLL 执行文件,再调用 DLL 中的 C 函数:
import tcc;
//编译 DLLtcc.build( "/start.dll" ).code = /***#include <windows.h>__declspec(dllexport) int Add( int a,int b ){
return a + b;}***/
//加载 DLLvar dll = raw.loadDll( "/start.dll",,"cdecl" );//调用 C 函数 var result = dll.Add(12,3);在 aardio 中嵌入并调用批处理:
import consoleimport process.batch;
//批处理 for 遍历并拆分字符串 var bat = process.batch(@echo off for %%i in (abc,def,xyz) do echo %%i
)console.log(bat.read(-1))
console.pause()aardio 调用 Rust 语言解析 TOML:
import console;import string.toml;
var str = string.toml.stringify({abc=123,d={1,2,3}});console.log( str );
import process.code;process.code("~\lib\string\toml.res");console.pause(true);在 aardio 里嵌入 PHP,以下短短几句代码,包含了 HTTP 服务器,PHP 服务端,嵌入的浏览器组件:
import win.ui;/DSG{{/var winform = win.form(text="Hello World / PHP_CGI 服务器")/}}/
var code = /*<html><head><meta charset="utf-8"><title>PHP 测试</title></head><body><?php echo '<p>Hello World / PHP_CGI 服务器</p>'; ?></body></html>*/string.save("/test.php",code);
import php.simpleHttpServer;var url = php.simpleHttpServer.startUrl("/test.php");
import web.form;var wb = web.form(winform);wb.go(url);
winform.show();win.loopMessage();aardio 调用 PowerShell,并且在 PowerShell 中调用 aardio。这甚至都不用带上体积较大的
System.Management.Automation.dll,一个轻巧的 EXE 就可以搞定一切,向下兼容到 PowerShell 2.0 :
import dotNet.ps;
var pScript = /*
声明 PowerShell 参数
param($win)
修改 aardio 对象属性
$win.title = "PowerShell + aardio";
调用 aardio 对象函数
$win.msgbox("这是 PowerShell 调用 aardio 打开的对话框。")
*/
import win;dotNet.ps(pScript,{win = win; //# 将 aardio 对象作为参数传给 PowerShell});aardio 执行 Ruby 语言代码 :
import win.ui;/DSG{{/var winform = win.form(text="执行 Ruby 代码")winform.add(edit={cls="edit";left=26;top=16;right=737;bottom=435;multiline=1;z=1})/}}/
import process.ruby;var out = process.ruby.exec("puts '测试 UTF-8'")winform.edit.print(out);
var out = process.ruby.eval([1, 2, { name: "tanaka", age: 19 }]
)winform.edit.print(out);
winform.show();win.loopMessage();aardio 调用 Node.js :
import console;
import nodeJs;
var js = /******
console.log(process.argv);
var startEnviron = require('startEnviron');console.log(startEnviron.dest);
******/
//自动分析 JS 代码中的 require 语句并安装依赖模块 nodeJs.requireByJs(js);
//把对象传给 node.js,在 JS 代码中用 require('startEnviron') 获取。nodeJs.startEnviron({src:"传个字符串",dest:{test:"嵌套的对象表,传给 node.js 都没问题",number:123, arr:{1,2,3} }})
//执行 JS,这里指定的启动参数在 JS 代码中可用 process.argv 获取。var prcs = nodeJs.exec(js,"--args1=1","--args2=1");prcs.logResponse();
console.pause(true);aardio 调用 Fortran ( DLL 源码在 aardio 范例里有 ) :
import console
//加载 DLL , DLL 路径前加 "/fortran.dll",,"cdecl");
//不声明直接调用,结构体默认传址,这不用改什么。var c = dll.__test_MOD_addbypoint({int x = 22;int y = 3;})console.log(c);
//可以先声明一下,参数类型加上 &声明为按引用传址(指针)var add = dll.api("__test_MOD_add","int(int &a,int &b)")var c = add(33,2); //Fortran 的数值参数默认都是传址(传指针)
//不声明直接调用可以用结构体取代指针 var c = dll.__test_MOD_add({int a=33},{int b=2});
//用 raw.int 创建传址数值也可以 var c = dll.__test_MOD_add(raw.int(33,true),raw.int(2,true));
//参数声明为传值时调用更简单,不声明调用时数值默认为 int 类型 var c = dll.__test_MOD_addbyval(33,2,raw.double(123));console.log(c);
//字符串 var str = "hello"; //只读字符串,改用 raw.buffer 创建可读写字节数组 dll.__test_MOD_hello(str,#str); //注意到字符串长度传过去
console.pause(true);aardio 调用 C++ :
import vc6;import console;console.open();
var vc = vc6( "/" )
//输入 C++源码 vc.cpp = /******#include <windows.h>
******/
//编译生成 DLLvc.exec('cl *.cpp','/W3' /警告等级/,'/MD' /使用多线程动态运行库/,'/O2 /Ot /EHsc' /代码优化选项/,'/D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL"' /定义常数和宏/,'/I"./INCLUDE"'/指定头文件目录/,'kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib' /导入库/,'/link /SUBSYSTEM:WINDOWS /MACHINE:X86' /*后面是链接参数 */,'/out:test.dll'/输出文件名/,'/dll' /输出 DLL/,'/LIBPATH:".\LIB" /LIBPATH:".\LIB2"' /指定库目录/)
var dll = raw.loadDll("/test.dll",,"cdecl");
import raw.interface;class testObject{ctor(){//创建 C++ 对象,并获取指针,注意这里使用了 P 尾标获取指针。var pTest = dll.CreateTestObjectP();
}
//创建对象 var obj = testObject();
//调用 C++ 函数 var name = obj.getName(25,25);console.log(name);
//调用 C++ 函数 var info = obj.getInfo({ int x;int y;BYTE name[256]})console.log( info.name );
console.pause();aardio 调用 FreeBASIC (DLL 源码在 aardio 范例里有 ) :
//加载 DLL,DLL 路径前面加上"\basic.dll",,"cdecl" //注意参数里指定使用 cdecl 调用约定。);
//定义结构体,当然也可以先声明一个 class 来创建实例。var info = {int x;INT y;}
// 然后直接调用 APIvar ret = dll.msgboxW(123,456,"测试一下好用不好用",info);
//最后打印结构体看一下值 import console;console.log(ret);
console.dumpJson(info);console.pause();aardio 调用 Delphi ( DLL 源码在 aardio 范例里有) :
import win.ui;
//内存加载 DLLvar delphiDll = raw.loadDll($"\Project1.dll");class win.ui.ctrl.delphiForm{ctor(parent,tParam){this.hwnd = delphiDll.CreateForm(parent.hwnd);};@..win.ui.ctrl.metaProperty()}/DSG{{/var winform = win.form(text="用 Delphi 语言为 aardio 编写控件";right=507;bottom=423;bgcolor=11842740)winform.add(custom={cls="delphiForm";text="嵌入 Delphi 控件";left=17;top=28;right=490;bottom=211;db=1;dl=1;dr=1;dt=1;z=1};edit={cls="edit";text="请先用 Delphi 打开此目录下的 DLL 源码工程编译生成 \Project1.dll";left=16;top=228;right=489;bottom=398;edge=1;multiline=1;z=2})/}}/
import web.json;winform.onTest = function(delphiStructParam){winform.edit.print("Delphi 调用了 aardio 函数,参数如下:");winform.edit.print(delphiStructParam);delphiStructParam.x = 90;
}winform.edit.text = "";
winform.show();win.loopMessage();aardio 调用 R 语言:
import console;import process.r;
//执行 R 代码,支持 aardio 模板语法 process.r.code = /*write("<?="这是 aardio 代码"?>",file=".data.txt");*/
//执行 R 代码,支持 aardio 模板语法 var out = process.r.loadcode(write("<?="这是 aardio 代码"?>",file=".data.txt");
)
//执行纯 R 代码,参数 @1 可以指定 R 代码或 R 文件。var out = process.r.exec(`args=commandArgs(T);write(args[1],file=".data.txt");
list 有点像 aardio 中的表(table),可以包含各种数据类型,
a <- list(hello = 1, world = "字符串" ) # <- 相当于 aardio 中的等号, R 的等号一般用于分隔键值对 print ( a[["world"]] ); # aardio 里的直接下标也是这么写 print ( a$world ); # 相当于 aardio 里的 a.worldprint ( a[1] ); # 这个返回的是键值对 hello = 1,不像 aadio 中 a[1] 与 a.hello 是指向不同的元素。print ( mode(a[1]) ); # 数据类型还是显示为 list
b <- TRUE #布尔值必须全大写 print( b )
向量
a = c(10, 20, 30, 40, 50)print( a[1] ) #起始下标为 1 ,这跟 aardio 一样 print( a[1:4] ) # 取出第 1 项到第 4 项
定义函数,与 aardio 语法类似
new.function <- function(a,b,c) {result <- a * b + c # 类似 aardio 中的 return a * b + c #print(result) # 指定返回值以后,还能继续执行后面的代码,不像 aardio 函数 return 后面的代码被忽略。}
print( new.function(2,3,1) )`,"测试一下"); //可以添加不定个数的启动参数 console.log( out );console.more(,true);
console.showLoading(" 正在安装 rjson 包");process.r.require("rjson","https://mirrors.ustc.edu.cn/CRAN/");//不会重复安装
var out = process.r.exec( `library("rjson") # 载入 rjson 包
args <- commandArgs(T);tab <- fromJSON(args[1], simplify=FALSE);
#不要用 print ,cat 不会加一堆不必要的东西 cat( toJSON(tab) )`, {name1 = "测试一下,传对象给 R 语言";name2 = "这是一个 aardio 对象"})
console.dump(out);
var rCode = /*testabc <- function(a,b,c) {result <- a * b + c # 类似 aardio 中的 return a * b + c #print(result) # 指定返回值以后,还能继续执行后面的代码,不像 aardio 函数 return 后面的代码被忽略。}*/
//启动 Rvar r = process.r.startRpc(rCode);
//调用 R 函数 var ret = r.testabc(2,3,1)
//打印 R 函数返回值 if(ret[["result"]]){console.log("R 函数返回值",ret[["result"]])}console.pause(true);aardio 调用 Julia :
import console;import julia;
//调用 Julia 函数 var ret = julia.sqrt(2);console.log(ret);
//导入 Julia 模块 julia.using("Base64");var data = julia.Base64.base64encode("测试一下");console.log( data );
//转换 Julia 数据类型 var buf = julia.value.build(raw.buffer("abc"));console.log(julia.typeof(buf));
//执行 Julia 代码并获取返回值 var refs = julia.eval("refs = IdDict(");
//查看 Julia 代码错误 console.log(julia.lasterr());
console.pause();aardio 调用 Nim 语言:
import console;
var nimCode = /*{.pragma: rtl, exportc, dynlib, cdecl.}
import md5
Nim 双引号中的字符串,相当于 aardio 中用单引号包含的转义字符串
aardio 中双引号包含的字符串,相当于 Nim 中的原始字符串: r"原始字符串"
Nim 与 aardio 都是 UTF-8 编码,aardio 的文本字符串在 Nim 中的类型为 cstring
Nim 中 string 可以隐式转换为 cstring, cstring 加上 $ 转为 string 类型
proc build*(str: cstring, num: ptr[cint]): cstring {.rtl.} =num[] = num[] * 2result = md5.getMD5($str)*/string.save("/test.nim",nimCode )
import process.nim;process.nim("c --app:lib -d:release -r test.nim")
//支持改为 //用 cdecl 调用约定的好处是:导出函数名直接可用,不会被加上修饰名 var test = raw.loadDll("/test.dll",,"cdecl")
//nim 与 aardio 的字符串都是 UTF-8 编码,UTF-8 真是到处通行,非常方便省了很多事 var build = test.api("build","str(str,int& num)" )
//一般 C 语言不能这么直接返回字符串(要考虑谁释放内存)。//但是 nim 可以投机取巧一下,nim 会自动回收内存,而这时候还来不及回收。var str,num = build("测试 abc",9)console.log(str,num)
//用 aardio 算出 MD5 对比一下,结果一模一样 import crypt;console.log(crypt.md5("测试 abc",false))console.pause();aardio 调用 V 语言:
import console;import process.v;
console.open();
//V 语言不支持中文路径,所以工程目录路径不要包含任何中文 string.save("/hello.v","struct Point {pub mut: //声明下面的字段公开、可变 x inty int}
[export: 'add'] //一定要用这句指定 DLL 导出函数名 pub fn add(a int,b int,mut pt &Point) int {pt.x = a+breturn a+b}" )
/*V 语言是翻译成 C 语言然后生成 DLL,生成的 DLL 依赖 VC 运行库,试了换成调用 TCC 编译,10KB 的 DLL 增大到 400KB,并且运行崩溃。*/process.v.shared("hello.v").waitOne();
//V 生成的 DLL 建议至少在 WIN10 上用,需要 VC++2017 运行库 import sys.vc14;sys.vc14.require(); //检测并自动安装 VC++ 运行库
//导入 DLL,注意要指定 cdecl 调用约定 var dll = raw.loadDll("/hello.dll",,"cdecl")
//调用 V 函数( V 是翻译为 C 语言,所以参考 C 语言的规则)var n,pt = dll.add(12,3,{int x=1;int y =2});
//输出结果 console.log(n);console.dumpJson(pt);
console.pause(true);
评论