diff --git a/CHANGELOG.md b/CHANGELOG.md
index 47882f2c..6c0d55c4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,10 @@ All notable changes to this project will be documented in this file.
- Remove the `tarray` module. The functionality of typed arrays will be moved to an external module
that can be installed via `jpm`.
- Add `from-pairs` to core.
+- Add `JPM_OS_WHICH` environment variable to jpm to allow changing auto-detection behavior.
+- The flychecker will consider any top-level calls of functions that start with `define-` to
+ be safe to execute and execute them. This allows certain patterns (like spork/path) to be
+ better processed by the flychecker.
## 1.15.5 - 2021-04-25
- Add `declare-headers` to jpm.
diff --git a/README.md b/README.md
index 35cd4f2b..582ca17f 100644
--- a/README.md
+++ b/README.md
@@ -234,7 +234,7 @@ See the examples directory for some example janet code.
## Discussion
Feel free to ask questions and join the discussion on the [Janet Gitter Channel](https://gitter.im/janet-language/community).
-Alternatively, check out [the #janet channel on Freenode](https://webchat.freenode.net/)
+Gitter provides Matrix and irc bridges as well.
## FAQ
@@ -246,8 +246,35 @@ will not. If your terminal does not support ANSI escape codes, run the REPL with
the `-n` flag, which disables color output. You can also try the `-s` if further issues
ensue.
-## Why Janet
+### Where is (favorite feature from other language)?
+
+It may exist, it may not. If you want to propose major language features, go ahead and open an issue, but
+they will likely by closed as "will not implement". Often, such features make one usecase simpler at the expense
+of 5 others by making the language more complicated.
+
+### Where is the example code?
+
+In the examples directory.
+
+### Is this a Clojure port?
+
+No. It's similar to Clojure superficially because I like Lisps and I like the asthetics.
+Internally, Janet is not at all like Clojure.
+
+### Are the immutable data structures (tuples and structs) implemented as hash tries?
+
+No. They are immutable arrays and hash tables. Don't try and use them like Clojure's vectors
+and maps, instead they work well as table keys or other identifiers.
+
+### Why can't we add (feature from Clojure) into the core?
+
+Usually, one of a few reasons:
+- Often, it already exists in a different form and the Clojure port would be redundant.
+- Clojure programs often generate a lot of garbage and rely on the JVM to clean it up.
+ Janet does not run on the JVM. We admittedly have a much more primitive GC.
+- We want to keep the Janet core small. With Lisps, usually a feature can be added as a library
+ without feeling "bolted on", especially when compared to ALGOL like languages.
+
+## Why is it called "Janet"?
Janet is named after the almost omniscient and friendly artificial being in [The Good Place](https://en.wikipedia.org/wiki/The_Good_Place).
-
-
diff --git a/assets/janet-the-good-place.gif b/assets/janet-the-good-place.gif
deleted file mode 100644
index d25aabc7..00000000
Binary files a/assets/janet-the-good-place.gif and /dev/null differ
diff --git a/jpm b/jpm
index 0366d0de..2ce568a5 100755
--- a/jpm
+++ b/jpm
@@ -6,14 +6,21 @@
# Basic Path Settings
#
-# Windows is the OS outlier
-(def- is-win (= (os/which) :windows))
-(def- is-mac (= (os/which) :macos))
-(def- sep (if is-win "\\" "/"))
-(def- objext (if is-win ".obj" ".o"))
-(def- modext (if is-win ".dll" ".so"))
-(def- statext (if is-win ".static.lib" ".a"))
-(def- absprefix (if is-win "C:\\" "/"))
+# Allow changing the behavior via an environment variable
+(def- host-os (keyword (string/ascii-lower (os/getenv "JPM_OS_WHICH" (os/which)))))
+(defn- define-utils
+ []
+ (def is-win (= host-os :windows))
+ (defglobal 'is-win is-win)
+ (defglobal 'is-mac (= host-os :macos))
+ (def sep (if is-win "\\" "/"))
+ (defglobal 'sep sep)
+ (defglobal 'objext (if is-win ".obj" ".o"))
+ (defglobal 'modext (if is-win ".dll" ".so"))
+ (defglobal 'statext (if is-win ".static.lib" ".a"))
+ (defglobal 'absprefix (if is-win "C:\\" "/")))
+
+(define-utils)
#
# Defaults
@@ -58,6 +65,9 @@
###END###
+# Redefine utils in case the above section is overriden on some installs.
+(define-utils)
+
(compwhen (not (dyn 'extra-lflags))
(def- extra-lflags []))
@@ -370,7 +380,7 @@
# flags needed for the janet binary and compiling standalone
# executables.
(def janet-lflags
- (case (os/which)
+ (case host-os
:macos ["-ldl" "-lm" ;thread-flags ;extra-lflags]
:windows [;thread-flags ;extra-lflags]
:linux ["-lm" "-ldl" "-lrt" ;thread-flags ;extra-lflags]
diff --git a/jpm.1 b/jpm.1
index 9d84a169..c05f8f78 100644
--- a/jpm.1
+++ b/jpm.1
@@ -269,5 +269,30 @@ An optional path to a git executable to use to clone git dependencies. By defaul
if you have a normal install of git.
.RE
+.B JPM_OS_WHICH
+.RS
+Use this option to override the C compiler and build system auto-detection for the host operating system. For example, set this
+environment variable to "posix" to make sure that on platforms like MinGW, you will use GCC instead of MSVC. On most platforms, users will not need to
+set this environment variable. Set this to one of the following
+strings:
+.IP
+\- windows
+.IP
+\- macos
+.IP
+\- linux
+.IP
+\- freebsd
+.IP
+\- openbsd
+.IP
+\- netbsd
+.IP
+\- bsd
+.IP
+\- posix
+.RE
+
+
.SH AUTHOR
Written by Calvin Rose
diff --git a/src/boot/boot.janet b/src/boot/boot.janet
index ff50e716..20e25190 100644
--- a/src/boot/boot.janet
+++ b/src/boot/boot.janet
@@ -3315,7 +3315,11 @@
[thunk source env where]
(when (tuple? source)
(def head (source 0))
- (def safe-check (safe-forms head))
+ (def safe-check
+ (or
+ (safe-forms head)
+ (if (symbol? head)
+ (if (string/has-prefix? "define-" head) is-safe-def))))
(cond
# Sometimes safe form
(function? safe-check)