diff --git a/CHANGELOG.md b/CHANGELOG.md index cf6d2e9..86a4c64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,11 +6,29 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Added -- `stateful` annotations are now properly enforced. Functions must be marked stateful - in order to update the state or spend tokens. ### Changed ### Removed +## [3.0.0] - 2019-05-21 +### Added +- `stateful` annotations are now properly enforced. Functions must be marked stateful + in order to update the state or spend tokens. +- Primitives `Contract.creator`, `Address.is_contract`, `Address.is_oracle`, + `Oracle.check` and `Oracle.check_query` has been added to Sophia. +- A byte array type `bytes(N)` has been added to generalize `hash (== bytes(32))` and + `signature (== bytes(64))` and allow for byte arrays of arbitrary fixed length. +- `Crypto.ecverify_secp256k1` has been added. +### Changed +- Address literals (+ Oracle, Oracle query and remote contracts) have been changed + from `#` to address as `ak_`, oracle `ok_`, + oracle query `oq_` and remote contract `ct_`. +- The compilation and typechecking of `letfun` (e.g. `let m(f, xs) = map(f, xs)`) was + not working properly and has been fixed. +### Removed +- `let rec` has been removed from the language, it has never worked. +- The standalone CLI compiler is served in the repo `aeternity/aesophia_cli` and has + been completely removed from `aesophia`. + ## [2.1.0] - 2019-04-11 ### Added - Stubs (not yet wired up) for compilation to FATE @@ -37,6 +55,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Simplify calldata creation - instead of passing a compiled contract, simply pass a (stubbed) contract string. -[Unreleased]: https://github.com/aeternity/aesophia/compare/v2.1.0...HEAD +[Unreleased]: https://github.com/aeternity/aesophia/compare/v3.0.0...HEAD +[3.0.0]: https://github.com/aeternity/aesophia/compare/v2.1.0...v3.0.0 [2.1.0]: https://github.com/aeternity/aesophia/compare/v2.0.0...v2.1.0 [2.0.0]: https://github.com/aeternity/aesophia/tag/v2.0.0 diff --git a/rebar.config b/rebar.config index 2485ce6..6099820 100644 --- a/rebar.config +++ b/rebar.config @@ -9,28 +9,13 @@ {tag, "2.8.0"}}} ]}. -{escript_incl_apps, [aesophia, aebytecode, getopt]}. -{escript_main_app, aesophia}. -{escript_name, aesophia}. -{escript_emu_args, "%%! \n"}. -{provider_hooks, [{post, [{compile, escriptize}]}]}. - -{post_hooks, [{"(linux|darwin|solaris|freebsd|netbsd|openbsd)", - escriptize, - "cp \"$REBAR_BUILD_DIR/bin/aesophia\" ./aesophia"}, - {"win32", - escriptize, - "robocopy \"%REBAR_BUILD_DIR%/bin/\" ./ aesophia* " - "/njs /njh /nfl /ndl & exit /b 0"} % silence things - ]}. - {dialyzer, [ {warnings, [unknown]}, {plt_apps, all_deps}, {base_plt_apps, [erts, kernel, stdlib, crypto, mnesia]} ]}. -{relx, [{release, {aesophia, "2.1.0"}, +{relx, [{release, {aesophia, "3.0.0"}, [aesophia, aebytecode, getopt]}, {dev_mode, true}, diff --git a/src/aesophia.app.src b/src/aesophia.app.src index 49fb95d..4fd6938 100644 --- a/src/aesophia.app.src +++ b/src/aesophia.app.src @@ -1,6 +1,6 @@ {application, aesophia, [{description, "Contract Language for aeternity"}, - {vsn, "2.1.0"}, + {vsn, "3.0.0"}, {registered, []}, {applications, [kernel, diff --git a/src/aesophia.erl b/src/aesophia.erl deleted file mode 100644 index 277b444..0000000 --- a/src/aesophia.erl +++ /dev/null @@ -1,78 +0,0 @@ --module(aesophia). - --export([main/1]). - --define(OPT_SPEC, - [ {src_file, undefined, undefined, string, "Sophia source code file"} - , {version, $V, "version", undefined, "Print compiler version"} - , {verbose, $v, "verbose", undefined, "Verbose output"} - , {help, $h, "help", undefined, "Show this message"} - , {outfile, $o, "out", string, "Output file (experimental)"} ]). - -usage() -> - getopt:usage(?OPT_SPEC, "aesophia"). - -main(Args) -> - case getopt:parse(?OPT_SPEC, Args) of - {ok, {Opts, []}} -> - case Opts of - [version] -> - print_vsn(); - [help] -> - usage(); - _ -> - compile(Opts) - end; - - {ok, {_, NonOpts}} -> - io:format("Can't understand ~p\n\n", [NonOpts]), - usage(); - - {error, {Reason, Data}} -> - io:format("Error: ~s ~p\n\n", [Reason, Data]), - usage() - end. - - -compile(Opts) -> - case proplists:get_value(src_file, Opts, undefined) of - undefined -> - io:format("Error: no input source file\n\n"), - usage(); - File -> - compile(File, Opts) - end. - -compile(File, Opts) -> - Verbose = proplists:get_value(verbose, Opts, false), - OutFile = proplists:get_value(outfile, Opts, undefined), - - try - Res = aeso_compiler:file(File, [pp_ast || Verbose]), - write_outfile(OutFile, Res), - io:format("\nCompiled successfully!\n") - catch - %% The compiler errors. - error:{type_errors, Errors} -> - io:format("\n~s\n", [string:join(["** Type errors\n" | Errors], "\n")]); - error:{parse_errors, Errors} -> - io:format("\n~s\n", [string:join(["** Parse errors\n" | Errors], "\n")]); - error:{code_errors, Errors} -> - ErrorStrings = [ io_lib:format("~p", [E]) || E <- Errors ], - io:format("\n~s\n", [string:join(["** Code errors\n" | ErrorStrings], "\n")]); - %% General programming errors in the compiler. - error:Error -> - Where = hd(erlang:get_stacktrace()), - ErrorString = io_lib:format("Error: ~p in\n ~p", [Error,Where]), - io:format("\n~s\n", [ErrorString]) - end. - -write_outfile(undefined, _) -> ok; -write_outfile(Out, ResMap) -> - %% Lazy approach - file:write_file(Out, term_to_binary(ResMap)), - io:format("Output written to: ~s\n", [Out]). - -print_vsn() -> - {ok, Vsn} = aeso_compiler:version(), - io:format("Compiler version: ~s\n", [Vsn]).