mirror of
https://github.com/janet-lang/janet
synced 2024-11-28 19:19:53 +00:00
Fix named arguments with optional args.
This commit is contained in:
parent
1d905bf07f
commit
a1172529bf
@ -3643,7 +3643,7 @@
|
|||||||
(defn ffi/context
|
(defn ffi/context
|
||||||
"Set the path of the dynamic library to implictly bind, as well
|
"Set the path of the dynamic library to implictly bind, as well
|
||||||
as other global state for ease of creating native bindings."
|
as other global state for ease of creating native bindings."
|
||||||
[native-path &named map-symbols lazy]
|
[&opt native-path &named map-symbols lazy]
|
||||||
(default map-symbols default-mangle)
|
(default map-symbols default-mangle)
|
||||||
(def lib (if lazy nil (ffi/native native-path)))
|
(def lib (if lazy nil (ffi/native native-path)))
|
||||||
(def lazy-lib (if lazy (delay (ffi/native native-path))))
|
(def lazy-lib (if lazy (delay (ffi/native native-path))))
|
||||||
@ -3663,26 +3663,19 @@
|
|||||||
(def type-args (map 1 arg-pairs))
|
(def type-args (map 1 arg-pairs))
|
||||||
(def computed-type-args (eval ~[,;type-args]))
|
(def computed-type-args (eval ~[,;type-args]))
|
||||||
(def {:native lib
|
(def {:native lib
|
||||||
:native-path np
|
|
||||||
:lazy lazy
|
:lazy lazy
|
||||||
:native-lazy llib
|
:native-lazy llib
|
||||||
:map-symbols ms} (assert (dyn *ffi-context*) "no ffi context found"))
|
:map-symbols ms} (assert (dyn *ffi-context*) "no ffi context found"))
|
||||||
(def raw-symbol (ms name))
|
(def raw-symbol (ms name))
|
||||||
|
(defn make-sig []
|
||||||
|
(ffi/signature :default ret-type ;computed-type-args))
|
||||||
|
(defn make-ptr []
|
||||||
|
(assert (ffi/lookup (llib) raw-symbol) "failed to find symbol"))
|
||||||
(if lazy
|
(if lazy
|
||||||
(let [ptr
|
|
||||||
(delay
|
|
||||||
(assert (ffi/lookup (llib) raw-symbol) "failed to find symbol"))
|
|
||||||
sig
|
|
||||||
(delay
|
|
||||||
(ffi/signature :default ret-type ;computed-type-args))]
|
|
||||||
~(defn ,name ,;meta [,;formal-args]
|
~(defn ,name ,;meta [,;formal-args]
|
||||||
(,ffi/call (,ptr) (,sig) ,;formal-args)))
|
(,ffi/call (,(delay (make-ptr))) (,(delay (make-sig))) ,;formal-args))
|
||||||
(let [ptr
|
|
||||||
(assert (ffi/lookup lib raw-symbol) "failed to find symbol")
|
|
||||||
sig
|
|
||||||
(ffi/signature :default ret-type ;computed-type-args)]
|
|
||||||
~(defn ,name ,;meta [,;formal-args]
|
~(defn ,name ,;meta [,;formal-args]
|
||||||
(,ffi/call ,ptr ,sig ,;formal-args))))))
|
(,ffi/call ,(make-ptr) ,(make-sig) ,;formal-args)))))
|
||||||
|
|
||||||
###
|
###
|
||||||
###
|
###
|
||||||
|
@ -1101,15 +1101,16 @@ JANET_CORE_FN(cfun_ffi_get_callback_trampoline,
|
|||||||
}
|
}
|
||||||
|
|
||||||
JANET_CORE_FN(janet_core_raw_native,
|
JANET_CORE_FN(janet_core_raw_native,
|
||||||
"(ffi/native path)",
|
"(ffi/native &opt path)",
|
||||||
"Load a shared object or dll from the given path, and do not extract"
|
"Load a shared object or dll from the given path, and do not extract"
|
||||||
" or run any code from it. This is different than `native`, which will "
|
" or run any code from it. This is different than `native`, which will "
|
||||||
"run initialization code to get a module table. Returns a `core/native`.") {
|
"run initialization code to get a module table. If `path` is nil, opens the current running binary. "
|
||||||
janet_fixarity(argc, 1);
|
"Returns a `core/native`.") {
|
||||||
const char *path = janet_getcstring(argv, 0);
|
janet_arity(argc, 0, 1);
|
||||||
char *processed_name = get_processed_name(path);
|
const char *path = janet_optcstring(argv, argc, 0, NULL);
|
||||||
|
char *processed_name = (NULL == path) ? NULL : get_processed_name(path);
|
||||||
Clib lib = load_clib(processed_name);
|
Clib lib = load_clib(processed_name);
|
||||||
if (path != processed_name) janet_free(processed_name);
|
if (NULL != path && path != processed_name) janet_free(processed_name);
|
||||||
if (!lib) janet_panic(error_clib());
|
if (!lib) janet_panic(error_clib());
|
||||||
JanetAbstractNative *anative = janet_abstract(&janet_native_type, sizeof(JanetAbstractNative));
|
JanetAbstractNative *anative = janet_abstract(&janet_native_type, sizeof(JanetAbstractNative));
|
||||||
anative->clib = lib;
|
anative->clib = lib;
|
||||||
|
@ -858,6 +858,7 @@ static JanetSlot janetc_fn(JanetFopts opts, int32_t argn, const Janet *argv) {
|
|||||||
for (i = 0; i < paramcount; i++) {
|
for (i = 0; i < paramcount; i++) {
|
||||||
Janet param = params[i];
|
Janet param = params[i];
|
||||||
if (namedargs) {
|
if (namedargs) {
|
||||||
|
arity--;
|
||||||
if (!janet_checktype(param, JANET_SYMBOL)) {
|
if (!janet_checktype(param, JANET_SYMBOL)) {
|
||||||
errmsg = "only named arguments can follow &named";
|
errmsg = "only named arguments can follow &named";
|
||||||
goto error;
|
goto error;
|
||||||
@ -915,7 +916,7 @@ static JanetSlot janetc_fn(JanetFopts opts, int32_t argn, const Janet *argv) {
|
|||||||
}
|
}
|
||||||
vararg = 1;
|
vararg = 1;
|
||||||
structarg = 1;
|
structarg = 1;
|
||||||
arity = i;
|
arity--;
|
||||||
seenamp = 1;
|
seenamp = 1;
|
||||||
namedargs = 1;
|
namedargs = 1;
|
||||||
named_table = janet_table(10);
|
named_table = janet_table(10);
|
||||||
|
@ -87,5 +87,11 @@
|
|||||||
|
|
||||||
(assert (= 15 (named-arguments :bob 3 :sally 5 :joe 7)) "named arguments 1")
|
(assert (= 15 (named-arguments :bob 3 :sally 5 :joe 7)) "named arguments 1")
|
||||||
|
|
||||||
|
(defn named-opt-arguments
|
||||||
|
[&opt x &named a b c]
|
||||||
|
(+ x a b c))
|
||||||
|
|
||||||
|
(assert (= 10 (named-opt-arguments 1 :a 2 :b 3 :c 4)) "named arguments 2")
|
||||||
|
|
||||||
(end-suite)
|
(end-suite)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user