diff --git a/README.md b/README.md index f67daef2..729ff873 100644 --- a/README.md +++ b/README.md @@ -61,13 +61,17 @@ $ nako3server macOS ``` +# 『圧縮』『解凍』命令のために brew install p7zip ``` Ubuntu/Debian ``` +# 『圧縮』『解凍』命令のために sudo apt-get install p7zip-full +# 『キー送信』命令のために +sudo apt-get install xdotool ``` 全てのコマンドが正しく動くかを確認するには、以下のコマンドを実行します。 diff --git a/doc/plugins.md b/doc/plugins.md index 2b846932..3835740e 100644 --- a/doc/plugins.md +++ b/doc/plugins.md @@ -14,14 +14,14 @@ ``` { '定数名': { 定義 }, - '命令名': { 定義 }, + '命令名': { 定義 }, ... } ``` ### 定義:関数 -プラグインの実体は、Object。 +プラグインの実体は、Object。実際の関数定義は、fnプロパティに行う。実際の関数の引数に加えて、システムを表すsysを用意する。 ``` { @@ -103,12 +103,16 @@ if (typeof (navigator) === 'object') { type: 'func', josi: [], fn: function (sys) { - const result = sys.__exec('HOGE', [arg1, arg2, arg3]) + const result = sys.__exec('HOGE', [arg1, arg2, arg3, sys]) console.log(result) } } ``` +また、関数の引数に与える、sysはなでしこ自身を表す。 +もし、代入的関数呼び出し(setter)であれば、sys.isSetterにtrueの値が入る。 + + なお、プラグインでは、以下のメソッドが使えるようになる。(すべて src/plugin_system.jsで定義されている。システム関数の初期化時に、これらの関数が追加される。) - sys.__findVar(name) diff --git a/package.json b/package.json index e33ac22f..906a2c39 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nadesiko3", - "version": "3.0.50", + "version": "3.0.51", "description": "Japanese Programming Language", "main": "src/index.js", "bin": { diff --git a/src/nako3.js b/src/nako3.js index b595296b..07a19f90 100644 --- a/src/nako3.js +++ b/src/nako3.js @@ -27,6 +27,7 @@ class NakoCompiler { this.__module = {} // requireなどで取り込んだモジュールの一覧 this.funclist = {} // プラグインで定義された関数 this.pluginfiles = {} // 取り込んだファイル一覧 + this.isSetter = false // 代入的関数呼び出しを管理(#290) // 必要なオブジェクトを覚えておく this.prepare = prepare this.lexer = lexer diff --git a/src/nako_gen.js b/src/nako_gen.js index 48081eb5..a5f0902d 100644 --- a/src/nako_gen.js +++ b/src/nako_gen.js @@ -739,18 +739,22 @@ class NakoGen { if (typeof (this.used_func[funcName]) === 'undefined') { this.used_func[funcName] = true } - // setter ? - if (node['setter']) argsOpts['setter'] = true // 関数呼び出しで、引数の末尾にthisを追加する-システム情報を参照するため args.push('__self') - if (argsOpts) args.push(JSON.stringify(argsOpts)) - + let funcBegin = '' + let funcEnd = '' + // setter? + if (node['setter']) { + funcBegin = ';__self.isSetter = true;' + funcEnd = ';__self.isSetter = false;' + } + // 関数呼び出しコードの構築 let argsCode = args.join(',') let code = `${funcNameS}(${argsCode})` if (func.return_none) { - code = `${code};\n` + code = `${funcBegin}${code};${funcEnd}\n` } else { - code = `(function(){ const tmp=${this.sore}=${code}; return tmp }).call(this)` + code = `(function(){ ${funcBegin}const tmp=${this.sore}=${code}; return tmp;${funcEnd}; }).call(this)` // ...して if (node.josi === 'して') { code += ';\n' diff --git a/src/plugin_node.js b/src/plugin_node.js index 450d0e92..857af70b 100644 --- a/src/plugin_node.js +++ b/src/plugin_node.js @@ -476,9 +476,9 @@ const PluginNode = { 'クリップボード': { // @クリップボードを取得設定(『クリップボード=値』で書換が可能) // @くりっぷぼーど type: 'func', josi: [['を']], - fn: function (v, sys, opt) { + fn: function (v, sys) { const ncp = require('copy-paste') - if (opt && opt['setter']) return ncp.copy(v) + if (sys.isSetter) return ncp.copy(v) return ncp.paste() } }, diff --git a/src/plugin_system.js b/src/plugin_system.js index f71ab673..ac7458af 100644 --- a/src/plugin_system.js +++ b/src/plugin_system.js @@ -3,7 +3,7 @@ const PluginSystem = { type: 'func', josi: [], fn: function (sys) { - sys.__v0['ナデシコバージョン'] = '3.0.50' + sys.__v0['ナデシコバージョン'] = '3.0.51' // システム関数を探す sys.__getSysValue = function (name, def) { if (sys.__v0[name] === undefined) return def diff --git a/test/func_call.js b/test/func_call.js index 90dc3d93..fdd6477d 100644 --- a/test/func_call.js +++ b/test/func_call.js @@ -56,10 +56,11 @@ describe('関数呼び出しテスト', () => { it('連続文後の=代入', () => { cmp('対象日=1504191600を日時変換して「 」まで切り取る。対象日を表示。', '2017/09/01') }) - it('関数の代入的呼び出し1', () => { + // 代入的呼び出し(#290) + it('関数の代入的呼び出し(#290)その1', () => { cmp('INTに3.5を代入;それを表示;', '3') }) - it('関数の代入的呼び出し2', () => { + it('関数の代入的呼び出し(#290)その2', () => { cmp('INT=3.5;それを表示;', '3') cmp('INTは3.5;それを表示;', '3') }) diff --git a/test/plugin_node_test.js b/test/plugin_node_test.js index 215f94ad..4eaa6d32 100644 --- a/test/plugin_node_test.js +++ b/test/plugin_node_test.js @@ -60,4 +60,10 @@ describe('plugin_node_test', () => { it('ファイル情報取得', () => { cmp('「' + testFileMe + '」のファイル情報取得;もし、それ["size"]が2000以上ならば;「OK」と表示。違えば「NG」と表示。', 'OK') }) + /* + it('クリップボード', () => { + const rnd = 'a' + Math.random() + cmp('クリップボード="' + rnd + '";クリップボードを表示。', rnd) + }) + */ })