mirror of
				https://github.com/janet-lang/janet
				synced 2025-11-04 09:33:02 +00:00 
			
		
		
		
	Compare commits
	
		
			9 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					0817e627ee | ||
| 
						 | 
					14d90239a7 | ||
| 
						 | 
					f5d11dc656 | ||
| 
						 | 
					6dcf5bf077 | ||
| 
						 | 
					ac2082e9b3 | ||
| 
						 | 
					dbac495bee | ||
| 
						 | 
					fe5ccb163e | ||
| 
						 | 
					1aea5ee007 | ||
| 
						 | 
					13cd9f8067 | 
@@ -1,15 +1,20 @@
 | 
			
		||||
# Changelog
 | 
			
		||||
All notable changes to this project will be documented in this file.
 | 
			
		||||
 | 
			
		||||
## 1.24.1 - 2022-08-24
 | 
			
		||||
- Fix FFI bug on Linux/Posix
 | 
			
		||||
- Improve parse error messages for bad delimiters.
 | 
			
		||||
- Add optional `name` parameter to the `short-fn` macro.
 | 
			
		||||
 | 
			
		||||
## 1.24.0 - 2022-08-14
 | 
			
		||||
- Add FFI support to 64-bit windows compiled with MSVC
 | 
			
		||||
- Don't process shared object names passed to dlopen.
 | 
			
		||||
- Add better support for windows console in the default shell.c for autocompletion and
 | 
			
		||||
- Add better support for windows console in the default shell.c for auto-completion and
 | 
			
		||||
  other shell-like input features.
 | 
			
		||||
- Improve default error message from `assert`.
 | 
			
		||||
- Add the `tabseq` macro for simpler table comprehensions.
 | 
			
		||||
- Allow setting `(dyn :task-id)` in fibers to improve context in supervisor messages. Prior to
 | 
			
		||||
  this change, supverisor messages over threaded channels would be from ambiguous threads/fibers.
 | 
			
		||||
  this change, supervisor messages over threaded channels would be from ambiguous threads/fibers.
 | 
			
		||||
 | 
			
		||||
## 1.23.0 - 2022-06-20
 | 
			
		||||
- Add experimental `ffi/` module for interfacing with dynamic libraries and raw function pointers. Only available
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
#define EXPORTER __declspec(dllexport) 
 | 
			
		||||
#define EXPORTER __declspec(dllexport)
 | 
			
		||||
#else
 | 
			
		||||
#define EXPORTER
 | 
			
		||||
#endif
 | 
			
		||||
@@ -57,15 +57,15 @@ double double_lots_2(
 | 
			
		||||
    double i,
 | 
			
		||||
    double j) {
 | 
			
		||||
    return a +
 | 
			
		||||
        10.0 * b +
 | 
			
		||||
        100.0 * c +
 | 
			
		||||
        1000.0 * d +
 | 
			
		||||
        10000.0 * e +
 | 
			
		||||
        100000.0 * f +
 | 
			
		||||
        1000000.0 * g +
 | 
			
		||||
        10000000.0 * h +
 | 
			
		||||
        100000000.0 * i +
 | 
			
		||||
        1000000000.0 * j;
 | 
			
		||||
           10.0 * b +
 | 
			
		||||
           100.0 * c +
 | 
			
		||||
           1000.0 * d +
 | 
			
		||||
           10000.0 * e +
 | 
			
		||||
           100000.0 * f +
 | 
			
		||||
           1000000.0 * g +
 | 
			
		||||
           10000000.0 * h +
 | 
			
		||||
           100000000.0 * i +
 | 
			
		||||
           1000000000.0 * j;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
EXPORTER
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								janet.1
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								janet.1
									
									
									
									
									
								
							@@ -164,10 +164,15 @@ Execute a string of Janet source. Source code is executed in the order it is enc
 | 
			
		||||
arguments are executed before later ones.
 | 
			
		||||
 | 
			
		||||
.TP
 | 
			
		||||
.BR \-E\ code arguments
 | 
			
		||||
.BR \-E\ code\ arguments...
 | 
			
		||||
Execute a single Janet expression as a Janet short-fn, passing the remaining command line arguments to the expression. This allows
 | 
			
		||||
more concise one-liners with command line arguments.
 | 
			
		||||
 | 
			
		||||
Example: janet -E '(print $0)' 12 is equivalent to '((short-fn (print $0)) 12)', which is in turn equivalent to
 | 
			
		||||
`((fn [k] (print k)) 12)`
 | 
			
		||||
 | 
			
		||||
See docs for the `short-fn` function for more details.
 | 
			
		||||
 | 
			
		||||
.TP
 | 
			
		||||
.BR \-d
 | 
			
		||||
Enable debug mode. On all terminating signals as well the debug signal, this will
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@
 | 
			
		||||
 | 
			
		||||
project('janet', 'c',
 | 
			
		||||
  default_options : ['c_std=c99', 'build.c_std=c99', 'b_lundef=false', 'default_library=both'],
 | 
			
		||||
  version : '1.24.0')
 | 
			
		||||
  version : '1.24.1')
 | 
			
		||||
 | 
			
		||||
# Global settings
 | 
			
		||||
janet_path = join_paths(get_option('prefix'), get_option('libdir'), 'janet')
 | 
			
		||||
 
 | 
			
		||||
@@ -2177,7 +2177,7 @@
 | 
			
		||||
      |(+ $ $) # use pipe reader macro for terse function literals.
 | 
			
		||||
      |(+ $&)  # variadic functions
 | 
			
		||||
  ```
 | 
			
		||||
  [arg]
 | 
			
		||||
  [arg &opt name]
 | 
			
		||||
  (var max-param-seen -1)
 | 
			
		||||
  (var vararg false)
 | 
			
		||||
  (defn saw-special-arg
 | 
			
		||||
@@ -2203,8 +2203,9 @@
 | 
			
		||||
          x))
 | 
			
		||||
      x))
 | 
			
		||||
  (def expanded (macex arg on-binding))
 | 
			
		||||
  (def name-splice (if name [name] []))
 | 
			
		||||
  (def fn-args (seq [i :range [0 (+ 1 max-param-seen)]] (symbol '$ i)))
 | 
			
		||||
  ~(fn [,;fn-args ,;(if vararg ['& '$&] [])] ,expanded))
 | 
			
		||||
  ~(fn ,;name-splice [,;fn-args ,;(if vararg ['& '$&] [])] ,expanded))
 | 
			
		||||
 | 
			
		||||
###
 | 
			
		||||
###
 | 
			
		||||
@@ -3886,7 +3887,7 @@
 | 
			
		||||
     "E" (fn E-switch [i &]
 | 
			
		||||
           (set no-file false)
 | 
			
		||||
           (def subargs (array/slice args (+ i 2)))
 | 
			
		||||
           (def src ~|,(parse (in args (+ i 1))))
 | 
			
		||||
           (def src ~(short-fn ,(parse (in args (+ i 1))) E-expression))
 | 
			
		||||
           (def thunk (compile src))
 | 
			
		||||
           (if (function? thunk)
 | 
			
		||||
             ((thunk) ;subargs)
 | 
			
		||||
 
 | 
			
		||||
@@ -5,9 +5,9 @@
 | 
			
		||||
 | 
			
		||||
#define JANET_VERSION_MAJOR 1
 | 
			
		||||
#define JANET_VERSION_MINOR 24
 | 
			
		||||
#define JANET_VERSION_PATCH 0
 | 
			
		||||
#define JANET_VERSION_PATCH 1
 | 
			
		||||
#define JANET_VERSION_EXTRA ""
 | 
			
		||||
#define JANET_VERSION "1.24.0"
 | 
			
		||||
#define JANET_VERSION "1.24.1"
 | 
			
		||||
 | 
			
		||||
/* #define JANET_BUILD "local" */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -996,7 +996,7 @@ JanetCompileResult janet_compile(Janet source, JanetTable *env, const uint8_t *w
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* C Function for compiling */
 | 
			
		||||
JANET_CORE_FN(cfun,
 | 
			
		||||
JANET_CORE_FN(cfun_compile,
 | 
			
		||||
              "(compile ast &opt env source lints)",
 | 
			
		||||
              "Compiles an Abstract Syntax Tree (ast) into a function. "
 | 
			
		||||
              "Pair the compile function with parsing functionality to implement "
 | 
			
		||||
@@ -1043,7 +1043,7 @@ JANET_CORE_FN(cfun,
 | 
			
		||||
 | 
			
		||||
void janet_lib_compile(JanetTable *env) {
 | 
			
		||||
    JanetRegExt cfuns[] = {
 | 
			
		||||
        JANET_CORE_REG("compile", cfun),
 | 
			
		||||
        JANET_CORE_REG("compile", cfun_compile),
 | 
			
		||||
        JANET_REG_END
 | 
			
		||||
    };
 | 
			
		||||
    janet_core_cfuns_ext(env, NULL, cfuns);
 | 
			
		||||
 
 | 
			
		||||
@@ -799,15 +799,6 @@ JANET_CORE_FN(cfun_ffi_signature,
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            /* Invert stack */
 | 
			
		||||
            for (uint32_t i = 0; i < arg_count; i++) {
 | 
			
		||||
                if (mappings[i].spec == JANET_SYSV64_MEMORY) {
 | 
			
		||||
                    uint32_t old_offset = mappings[i].offset;
 | 
			
		||||
                    size_t el_size = type_size(mappings[i].type);
 | 
			
		||||
                    mappings[i].offset = stack_count - ((el_size + 7) / 8) - old_offset;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -206,6 +206,37 @@ static void popstate(JanetParser *p, Janet val) {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void delim_error(JanetParser *parser, size_t stack_index, char c, const char *msg) {
 | 
			
		||||
    JanetParseState *s = parser->states + stack_index;
 | 
			
		||||
    JanetBuffer *buffer = janet_buffer(40);
 | 
			
		||||
    if (msg) {
 | 
			
		||||
        janet_buffer_push_cstring(buffer, msg);
 | 
			
		||||
    }
 | 
			
		||||
    if (c) {
 | 
			
		||||
        janet_buffer_push_u8(buffer, c);
 | 
			
		||||
    }
 | 
			
		||||
    if (stack_index > 0) {
 | 
			
		||||
        janet_buffer_push_cstring(buffer, ", ");
 | 
			
		||||
        if (s->flags & PFLAG_PARENS) {
 | 
			
		||||
            janet_buffer_push_u8(buffer, '(');
 | 
			
		||||
        } else if (s->flags & PFLAG_SQRBRACKETS) {
 | 
			
		||||
            janet_buffer_push_u8(buffer, '[');
 | 
			
		||||
        } else if (s->flags & PFLAG_CURLYBRACKETS) {
 | 
			
		||||
            janet_buffer_push_u8(buffer, '{');
 | 
			
		||||
        } else if (s->flags & PFLAG_STRING) {
 | 
			
		||||
            janet_buffer_push_u8(buffer, '"');
 | 
			
		||||
        } else if (s->flags & PFLAG_LONGSTRING) {
 | 
			
		||||
            int32_t i;
 | 
			
		||||
            for (i = 0; i < s->argn; i++) {
 | 
			
		||||
                janet_buffer_push_u8(buffer, '`');
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        janet_formatb(buffer, " opened at line %d, column %d", s->line, s->column);
 | 
			
		||||
    }
 | 
			
		||||
    parser->error = (const char *) janet_string(buffer->data, buffer->count);
 | 
			
		||||
    parser->flag |= JANET_PARSER_GENERATED_ERROR;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int checkescape(uint8_t c) {
 | 
			
		||||
    switch (c) {
 | 
			
		||||
        default:
 | 
			
		||||
@@ -612,7 +643,7 @@ static int root(JanetParser *p, JanetParseState *state, uint8_t c) {
 | 
			
		||||
        case '}': {
 | 
			
		||||
            Janet ds;
 | 
			
		||||
            if (p->statecount == 1) {
 | 
			
		||||
                p->error = "unexpected delimiter";
 | 
			
		||||
                delim_error(p, 0, c, "unexpected closing delimiter ");
 | 
			
		||||
                return 1;
 | 
			
		||||
            }
 | 
			
		||||
            if ((c == ')' && (state->flags & PFLAG_PARENS)) ||
 | 
			
		||||
@@ -633,7 +664,7 @@ static int root(JanetParser *p, JanetParseState *state, uint8_t c) {
 | 
			
		||||
                    ds = close_struct(p, state);
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                p->error = "mismatched delimiter";
 | 
			
		||||
                delim_error(p, p->statecount - 1, c, "mismatched delimiter ");
 | 
			
		||||
                return 1;
 | 
			
		||||
            }
 | 
			
		||||
            popstate(p, ds);
 | 
			
		||||
@@ -684,26 +715,7 @@ void janet_parser_eof(JanetParser *parser) {
 | 
			
		||||
    size_t oldline = parser->line;
 | 
			
		||||
    janet_parser_consume(parser, '\n');
 | 
			
		||||
    if (parser->statecount > 1) {
 | 
			
		||||
        JanetParseState *s = parser->states + (parser->statecount - 1);
 | 
			
		||||
        JanetBuffer *buffer = janet_buffer(40);
 | 
			
		||||
        janet_buffer_push_cstring(buffer, "unexpected end of source, ");
 | 
			
		||||
        if (s->flags & PFLAG_PARENS) {
 | 
			
		||||
            janet_buffer_push_u8(buffer, '(');
 | 
			
		||||
        } else if (s->flags & PFLAG_SQRBRACKETS) {
 | 
			
		||||
            janet_buffer_push_u8(buffer, '[');
 | 
			
		||||
        } else if (s->flags & PFLAG_CURLYBRACKETS) {
 | 
			
		||||
            janet_buffer_push_u8(buffer, '{');
 | 
			
		||||
        } else if (s->flags & PFLAG_STRING) {
 | 
			
		||||
            janet_buffer_push_u8(buffer, '"');
 | 
			
		||||
        } else if (s->flags & PFLAG_LONGSTRING) {
 | 
			
		||||
            int32_t i;
 | 
			
		||||
            for (i = 0; i < s->argn; i++) {
 | 
			
		||||
                janet_buffer_push_u8(buffer, '`');
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        janet_formatb(buffer, " opened at line %d, column %d", s->line, s->column);
 | 
			
		||||
        parser->error = (const char *) janet_string(buffer->data, buffer->count);
 | 
			
		||||
        parser->flag |= JANET_PARSER_GENERATED_ERROR;
 | 
			
		||||
        delim_error(parser, parser->statecount - 1, 0, "unexpected end of source");
 | 
			
		||||
    }
 | 
			
		||||
    parser->line = oldline;
 | 
			
		||||
    parser->column = oldcolumn;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								tools/format.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								tools/format.sh
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
		Reference in New Issue
	
	Block a user