├── .gitignore ├── CMakeLists.txt ├── LICENSE ├── OSPlatformUtil ├── .gitignore ├── LICENSE ├── README.md ├── VERSION ├── demo │ └── testOS.cpp ├── img │ ├── centos.jpg │ ├── mac.jpg │ ├── unbuntu.jpg │ └── windows.jpg └── src │ └── osplatformutil.h ├── README.md ├── _config.yml ├── doc ├── syntax │ └── syntax.md └── vm │ ├── bytecode.md │ └── thinking.md ├── include ├── BerryMath.h ├── ast.h ├── compiler.h ├── dylib.h ├── interpreter.h ├── lex.h ├── stack.h ├── sym.h ├── types.h ├── value.h └── vm.h ├── lines.py ├── main.cpp ├── modules ├── RegExp │ ├── CMakeLists.txt │ ├── library.cpp │ └── library.h ├── bmlang │ └── init.bm ├── compile_all.sh ├── fs │ ├── CMakeLists.txt │ ├── Makefile │ ├── cmake-build-debug │ │ └── Makefile │ ├── library.cpp │ └── library.h ├── http │ ├── CMakeLists.txt │ ├── Makefile │ ├── cmake-build-debug │ │ └── Makefile │ ├── library.cpp │ └── library.h ├── os │ ├── CMakeLists.txt │ ├── Makefile │ ├── cmake-build-debug │ │ └── Makefile │ ├── library.cpp │ └── library.h ├── random │ ├── CMakeLists.txt │ ├── Makefile │ ├── cmake-build-debug │ │ └── Makefile │ ├── library.cpp │ └── library.h ├── sys │ ├── CMakeLists.txt │ ├── Makefile │ ├── cmake-build-debug │ │ └── Makefile │ ├── library.cpp │ └── library.h └── time │ ├── CMakeLists.txt │ ├── Makefile │ ├── cmake-build-debug │ └── Makefile │ ├── library.cpp │ └── library.h ├── src ├── BerryMath.cpp ├── ast.cpp ├── compiler.cpp ├── dylib.cpp ├── interpreter.cpp ├── lex.cpp ├── stack.cpp ├── sym.cpp ├── types.cpp ├── value.cpp └── vm.cpp ├── system_files ├── information.json └── system.json ├── test.bm ├── tests ├── CMakeLists.txt ├── Makefile ├── astTest.cpp ├── cmake-build-debug │ ├── Makefile │ └── tests ├── lexerTest.cpp ├── main.cpp └── tests ├── testscript ├── BinaryTree.bm ├── class.bm ├── function-args-list.bm ├── hex-oct-bin.bm ├── lambda.bm └── refer.bm └── tools ├── bcdump ├── CMakeLists.txt ├── bcdump └── main.cpp └── bineidtor ├── CMakeLists.txt ├── bc.in └── main.cpp /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Compiled Object files 5 | *.slo 6 | *.lo 7 | *.o 8 | *.obj 9 | 10 | # Precompiled Headers 11 | *.gch 12 | *.pch 13 | 14 | # Compiled Dynamic libraries 15 | *.so 16 | *.dylib 17 | *.dll 18 | 19 | # Fortran module files 20 | *.mod 21 | *.smod 22 | 23 | # Compiled Static libraries 24 | *.lai 25 | *.la 26 | *.a 27 | *.lib 28 | 29 | # Executables 30 | *.exe 31 | *.out 32 | *.app 33 | 34 | # 忽略CLion的系统文件 35 | .idea/ 36 | 37 | # 忽略CMake产生的文件 38 | CMakeFiles/ 39 | cmake_install.cmake 40 | CMakeCache.txt 41 | *.cbp 42 | Makefile 43 | cmake-build-debug/ 44 | cmake-*/ 45 | 46 | # 忽略release文件 47 | /BerryMath 48 | 49 | build* 50 | 51 | .vscode/ -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.9) 2 | project(BerryMath) 3 | 4 | option(SHARED "Set compile option: shared" OFF) 5 | 6 | include_directories( 7 | include 8 | ) 9 | 10 | AUX_SOURCE_DIRECTORY(src DIR_SRCS) 11 | 12 | set(CMAKE_CXX_STANDARD 17) 13 | 14 | SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -glldb") 15 | SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall") 16 | 17 | add_definitions("-g") 18 | 19 | if (SHARED) 20 | message("shared") 21 | add_library(BerryMath SHARED 22 | src/BerryMath.cpp include/BerryMath.h 23 | src/value.cpp include/value.h 24 | src/lex.cpp include/lex.h src/ast.cpp include/ast.h src/dylib.cpp include/dylib.h src/interpreter.cpp include/interpreter.h src/compiler.cpp include/compiler.h 25 | src/vm.cpp include/vm.h include/types.h OSPlatformUtil/src/osplatformutil.h src/types.cpp src/sym.cpp include/sym.h src/stack.cpp include/stack.h) 26 | else () 27 | message("unshared") 28 | add_executable( 29 | BerryMath main.cpp 30 | src/BerryMath.cpp include/BerryMath.h 31 | src/value.cpp include/value.h 32 | src/lex.cpp include/lex.h src/ast.cpp include/ast.h src/dylib.cpp include/dylib.h src/interpreter.cpp include/interpreter.h src/compiler.cpp include/compiler.h src/vm.cpp include/vm.h include/types.h OSPlatformUtil/src/osplatformutil.h src/sym.cpp include/sym.h src/types.cpp src/stack.cpp include/stack.h) 33 | 34 | install(TARGETS BerryMath 35 | CONFIGURATIONS Release 36 | RUNTIME DESTINATION /usr/local/bin) 37 | 38 | INSTALL(TARGETS BerryMath 39 | RUNTIME DESTINATION bin 40 | ) 41 | endif () -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /OSPlatformUtil/.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Compiled Object files 5 | *.slo 6 | *.lo 7 | *.o 8 | *.obj 9 | 10 | # Precompiled Headers 11 | *.gch 12 | *.pch 13 | 14 | # Compiled Dynamic libraries 15 | *.so 16 | *.dylib 17 | *.dll 18 | 19 | # Fortran module files 20 | *.mod 21 | *.smod 22 | 23 | # Compiled Static libraries 24 | *.lai 25 | *.la 26 | *.a 27 | *.lib 28 | 29 | # Executables 30 | *.exe 31 | *.out 32 | *.app 33 | -------------------------------------------------------------------------------- /OSPlatformUtil/README.md: -------------------------------------------------------------------------------- 1 | # OSPlatformUtil 2 | 3 | judgment the operating system with C/C++ 4 | 5 | # License 6 | 7 | Apache License 2.0 8 | 9 | --- 10 | 11 | Blog : http://blog.csdn.net/itas109 12 | 13 | QQ Group : [129518033](http://shang.qq.com/wpa/qunwpa?idkey=2888fa15c4513e6bfb9347052f36e437d919b2377161862948b2a49576679fc6) 14 | 15 | --- 16 | 17 | # Last Modify 18 | ## Version: 1.0.0.180723 19 | by itas109 on 2018-07-23 20 | 21 | http://blog.csdn.net/itas109 22 | 23 | https://github.com/itas109 24 | 25 | --- 26 | # Result 27 | 28 | ## ubuntu 29 | ![image](https://github.com/itas109/OSPlatformUtil/blob/master/img/unbuntu.jpg) 30 | 31 | ## centos 32 | 33 | ![image](https://github.com/itas109/OSPlatformUtil/blob/master/img/centos.jpg) 34 | 35 | ## windows 36 | ![image](https://github.com/itas109/OSPlatformUtil/blob/master/img/windows.jpg) 37 | 38 | ## MAC 39 | ![image](https://github.com/itas109/OSPlatformUtil/blob/master/img/mac.jpg) 40 | 41 | --- 42 | 43 | ## First Version by itas109 on 2018-07-23 44 | 45 | --- -------------------------------------------------------------------------------- /OSPlatformUtil/VERSION: -------------------------------------------------------------------------------- 1 | 1.0.0.180723 -------------------------------------------------------------------------------- /OSPlatformUtil/demo/testOS.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include "../src/osplatformutil.h" 4 | 5 | using namespace std; 6 | 7 | int main() 8 | { 9 | #if defined I_OS_MAC 10 | 11 | cout<<"this is MAC"< 25 | # if defined(TARGET_OS_MAC) && TARGET_OS_MAC 26 | # define I_OS_DARWIN 27 | # ifdef __LP64__ 28 | # define I_OS_DARWIN64 29 | # else 30 | # define I_OS_DARWIN32 31 | # endif 32 | # else 33 | # error "not support this Apple platform" 34 | # endif 35 | // ANDROID 36 | #elif defined(__ANDROID__) || defined(ANDROID) 37 | # define I_OS_ANDROID 38 | # define I_OS_LINUX 39 | // Windows 40 | #elif !defined(SAG_COM) && (!defined(WINAPI_FAMILY) || WINAPI_FAMILY==WINAPI_FAMILY_DESKTOP_APP) && (defined(WIN64) || defined(_WIN64) || defined(__WIN64__)) 41 | # define I_OS_WIN32 42 | # define I_OS_WIN64 43 | #elif !defined(SAG_COM) && (defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)) 44 | # if defined(WINAPI_FAMILY) 45 | # ifndef WINAPI_FAMILY_PC_APP 46 | # define WINAPI_FAMILY_PC_APP WINAPI_FAMILY_APP 47 | # endif 48 | # if defined(WINAPI_FAMILY_PHONE_APP) && WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP 49 | # define I_OS_WINRT 50 | # elif WINAPI_FAMILY==WINAPI_FAMILY_PC_APP 51 | # define I_OS_WINRT 52 | # else 53 | # define I_OS_WIN32 54 | # endif 55 | # else 56 | # define I_OS_WIN32 57 | # endif 58 | //CYGWIN 59 | #elif defined(__CYGWIN__) 60 | # define I_OS_CYGWIN 61 | // sun os 62 | #elif defined(__sun) || defined(sun) 63 | # define I_OS_SOLARIS 64 | // LINUX 65 | #elif defined(__linux__) || defined(__linux) 66 | # define I_OS_LINUX 67 | // FREEBSD 68 | #elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) 69 | # ifndef __FreeBSD_kernel__ 70 | # define I_OS_FREEBSD 71 | # endif 72 | # define I_OS_FREEBSD_KERNEL 73 | // OPENBSD 74 | #elif defined(__OpenBSD__) 75 | # define I_OS_OPENBSD 76 | // IBM AIX 77 | #elif defined(_AIX) 78 | # define I_OS_AIX 79 | #else 80 | # error "not support this OS" 81 | #endif 82 | 83 | #if defined(I_OS_WIN32) || defined(I_OS_WIN64) || defined(I_OS_WINRT) 84 | # define I_OS_WIN 85 | #endif 86 | 87 | #if defined(I_OS_WIN) 88 | # undef I_OS_UNIX 89 | #elif !defined(I_OS_UNIX) 90 | # define I_OS_UNIX 91 | #endif 92 | 93 | #ifdef I_OS_DARWIN 94 | #define I_OS_MAC 95 | #endif 96 | #ifdef I_OS_DARWIN32 97 | #define I_OS_MAC32 98 | #endif 99 | #ifdef I_OS_DARWIN64 100 | #define I_OS_MAC64 101 | #endif 102 | 103 | #endif // OSPLATFORMUTIL_H -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BerryMath 2 | 3 | BerryMath is a simple programming language. 4 | We'll keep it be stronger, keep it to grow up. 5 | I hope this language will great at math, AI. 6 | Of course, if you just want it as a gadget rather than a systemic programming language, it can be used to quickly develop a small program. 7 | 8 | ## Build 9 | We use cmake to manage the project. 10 | If you don't have cmake, you must first install cmake. 11 | ``` shell 12 | cmake . 13 | ``` 14 | or 15 | ``` shell 16 | cmake -DSHARED=OFF . 17 | ``` 18 | These shell scripts can also compile it into an executable. 19 | 20 | And use this shell script: 21 | ``` shell 22 | cmake -DSHARED=ON . 23 | ``` 24 | can compile it into an shared library. 25 | 26 | ## Usage 27 | When you had built this project, open the executable can run the script by BerryMath. 28 | If you want to use BerryMath Interpreter in your project, you can include this by shared library. Header files and dynamic link libraries in Linux and Mac are installed in the `/usr/BM/dev` directory, and windows is in `C:\BM\dev`. 29 | 30 | Use `BM::Object` can create a BerryMath object, use `BM::Number`/`BM::String`/`BM::Function`/`BM::NativeFunction` to create a number, a string, a function or a native function. 31 | Use `BM::Variable` to create a BerryMath variable. 32 | Use `BM::scope` to create a scope to save variables. 33 | Use `BM::AST` to build BerryMath script Abstract Syntax Tree(AST). 34 | Use `BM::Interpreter` to run the BM script or compile the BM script into a .bmast file. 35 | ... 36 | 37 | ## Supports 38 | Operating System Platform Judgment based on [OSPlatformUtil](https://github.com/itas109/OSPlatformUtil) 39 | Http Request in module http based on [curl](https://github.com/curl/curl) 40 | 41 | ## License 42 | [Apache 2.0 License](LICENSE) 43 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-slate -------------------------------------------------------------------------------- /doc/syntax/syntax.md: -------------------------------------------------------------------------------- 1 | # Syntax 2 | 3 | ## Values 4 | ### Types 5 | number, string, null, undefined, object, function, native-function 6 | ### Formats 7 | number: `\d+\.?\d*`/`0[xob]\d+`, string: `".*""` or `'.+'`, null: `null`, undefined: `undefined`, object: [Development], function: [See define a function], native-function: None 8 | ### Expression 9 | #### Numeric Representation in Other Numbers 10 | ##### Hexadecimal 11 | We use header `0x` to express hexadecimal number; 12 | ##### Octal 13 | We use header `0o` to express octal number; 14 | ##### Binary 15 | We use header `0b` to express binary number; 16 | #### Operators 17 | =, :, ==, !=, <=, >=, <, >, ( ), [ ], { }, ., (comma), &, |, ^, ~, &&, ||, !, +, -, *, /, %, **, <<, >>, +=, -=, *-, /=, %=, **=, <<=, >>=, &=, |=, ^=, in, of, ~~ 18 | #### in/of operator 19 | Format: ` in ` 20 | Used to detect whether the second expr has a value with the keyword expr1. 21 | 22 | #### Operator ~~ 23 | Format: n~~m 24 | Returns all integers in an interval [n, m) 25 | _note_: If n, m is a floating point number, then the system automatically integrates the value of n, m downwards. 26 | 27 | #### Monomial Express 28 | Format: 29 | Can convert to * to calculate. 30 | Example: 31 | ``` 32 | import sys; 33 | let a = 2; 34 | sys.io.print(2a);// 4 35 | ``` 36 | 37 | #### Calling Functions 38 | Syntax: `(arg1, arg2, arg3...)` 39 | Demo: 40 | ``` 41 | // #1 42 | hello("BerryMath"); 43 | ``` 44 | ``` 45 | // #2 46 | Hello.hello("BerryMath"); 47 | ``` 48 | And you can use operator= to specify setting arguments 49 | Demo: 50 | ``` 51 | hello("BerryMath", id = 1234); 52 | ``` 53 | ##### The Writing Method of Omitting Bracket 54 | Condition: It is a single argument and the argument is a single face quantity or identifier (that is, there is no sign, nor can attributes such as A.B) 55 | Syntax: ` ` 56 | 57 | #### Get properties in an object 58 | Use operator. to get properties in an object 59 | Demo: 60 | ``` 61 | let b = a.b; 62 | ``` 63 | Use operator[] also can get properties 64 | Demo: 65 | ``` 66 | let b = a["b"]; 67 | ``` 68 | #### Prioritization 69 | "[" "." 15 70 | "(" 14 71 | "++" "--" "!" "~" "**" 13 72 | "*" "/" "%" 12 73 | "+" "-" 11 74 | "<<" ">>" 10 75 | ">" ">=" "<" "<=" 9 76 | "==" "!=" 8 77 | "&" 7 78 | "^" 6 79 | "|" 5 80 | "&&" 4 81 | "||" "~~" 3 82 | "=" "*=" "/=" "%=" "+=" "-=" ">>=" "<<=" "^=" "&=" "|=" "in" "of" 2 83 | "," 1 84 | 85 | ## Declares 86 | ### Variable 87 | Use key word `let` to declare a variable. 88 | Demo: 89 | ``` 90 | let a = 1 + 3; 91 | ``` 92 | ### Function 93 | Use key word `def` to declare a function. 94 | Use `return` to return a result. 95 | ``` 96 | def expr() { 97 | return 1 * (2 + 3); 98 | } 99 | ``` 100 | You can get some arguments, declare them in the brackets. 101 | ``` 102 | def add(a, b) { 103 | return a + b; 104 | } 105 | ``` 106 | Use operator= with arguments can declare default value of the arguments. 107 | ``` 108 | def sub(a = 4 + 2, b = 5) { 109 | return a + b; 110 | } 111 | ``` 112 | Each function contains a variable args to get a list of arguments. 113 | ``` 114 | def p() { 115 | return argv; 116 | } 117 | p(1, 2, 3, 4, 5); 118 | ``` 119 | #### If you want to define a lambda function, change the parentheses of the parameter definition to brackets 120 | Demo: 121 | ``` 122 | def did(fun) { 123 | return fun(2); 124 | } 125 | did(def l[a] { 126 | return a ** 10; 127 | });// 1024 128 | ``` 129 | 130 | ### Reference variable 131 | Use key word `refer` to declare a reference variable. 132 | **#: Initialization is necessary or the consequences are at your own expense.** 133 | **#: Reference variables are only applicable to variables, and reference assignments in the form of `refer a = b.c` are not accepted for the time being.** 134 | Demo: 135 | ``` 136 | let a = 0; 137 | refer b = a; 138 | b++;// a == 1 139 | ``` 140 | And you can also use operator `->` to declare a reference variable. 141 | Demo: 142 | ``` 143 | let a = 0; 144 | let b -> a; 145 | b++;// a == 1 146 | ``` 147 | 148 | ### Reference arguments 149 | You can define a reference parameter by adding the keyword `refer` before the parameter name. 150 | Demo: 151 | ``` 152 | def swap(refer a, refer b) { 153 | let tmp = a; 154 | a = b; 155 | b = a; 156 | } 157 | let a = 0; 158 | let b = 1; 159 | swap(a, b);// a = 1, b = 0 160 | ``` 161 | **#: All referenced variables/parameters are automatically de-referenced when the type changes!!!** 162 | 163 | ## Process statement 164 | ### If 165 | This statement controls the code that runs according to conditions 166 | Syntax: 167 | ``` 168 | if () { 169 |