310 karma · joined October 31, 2012
macOS’s approach only works nicely if you expect to have one simultaneous task per app OR you don’t expect to switch between apps. Once you have multiple simultaneous tasks in multiple apps, it becomes really cumbersome to use command tab. My job tends to involve exactly the pattern of window switching that macOS isn’t made for.
There have been 8 mass shootings in America in the last 7 days. No one was running to twitter to speculate about their causes. No politicians were raising concerns about troubling trends. The shootings were going completely unremarked on in national politics… until a shooter happened to be trans.
If you want to speculate that commentators and politicians are giving the other incidents the same attention, we would literally never hear the end of it. On average, almost 2 mass shootings happen per day. But, for some reason, those incidents weren’t given national attention. Curious.
On the other hand, I loved MGS3 on euro extreme! It really required mastering every trick in the game. Every little advantage you could squeeze into a boss fight was essential. Escape from Groznygrad was hell, though. By far the single hardest part of the game.
I’d recommend ensuring you have some sort of VPN solution so that you can access your vault away from home, too.
Personally, I just decided to use the 1st party server. I realized that reliable access to my vault is a service I really don’t want to be without due to technical issues in my setup.
In its list of assumptions compilers are allowed to make about the code they receive, we can see…
> The definition of a function that is defined and declared inline in the compilation environment must be the same at run time.
> Within a function named F, the compiler may (but is not required to) assume that an apparent recursive call to a function named F refers to the same definition of F, unless that function has been declared notinline. The consequences of redefining such a recursively defined function F while it is executing are undefined.
> A call within a file to a named function that is defined in the same file refers to that function, unless that function has been declared notinline. The consequences are unspecified if functions are redefined individually at run time or multiply defined in the same file.
http://clhs.lisp.se/Body/03_bbc.htm
So, technically the compiler is allowed to remove runtime function call indirection for functions defined in the same file and/or recursive calls (unless you use a NOTINLINE declaration). In practice, you probably won’t see that happen unless you crank up the optimizations when compiling.
You are right that the language explicitly allows redefining functions in general
> Except in the situations explicitly listed above, a function defined in the evaluation environment is permitted to have a different definition or a different signature at run time, and the run-time definition prevails.
http://www.lispworks.com/documentation/lw50/CLHS/Body/02_add...
That is the system I was alluding to. It’s been a few years since I’ve done anything with CL and so it seems my memory was slightly off.
If you redefine the #\) reader macro, you could use it in a top-level context. That’s probably not a good idea since it’s easy to accidentally have too many #\) when closing a deeply nested expression and thus accidentally invoke the macro.
Aside from signaling an error, the #\) reader macro is also useful because it changes the rules when reading symbols. Basically, if you write (+ foo bar), the existence of the #\) macro helps the reader know that you’re referencing the “bar” symbol rather than the “bar)” symbol.
Generally, when people define new balanced-pair syntax for Common Lisp, (such as a #\{ macro for hash tables) they will follow the same pattern and define a corresponding reader macro for the closing side that always signals an error for all the same reasons.
Edit: also, as others have pointed out, you seem to be mistakenly assuming that the redefinition takes affect mid-way through reading the expression. That’s not how CL works. CL cleanly separates the process of executing code into a few distinct phases. First, the reader reads an entire expression (“form” in lisp terms). Then, that form is macroexpanded (traditional macros, not reader macros!) as needed before (optionally) being compiled and then executed.
The change to the read table would happen during the execution phase — well ordered after the original characters for that form are out of the picture.
You COULD force a change to the readtable mid-way through reading a form using the #. reader macro, but that definitely gets into chainsaw-juggling territory.