The `get-handle' method provides the underlying Cairo surface for
a bitmap, while the unsafe `make-handle-brush' function supports the
use of a Cairo surface as a `brush%'.
Also, add `racket/draw/unsafe/cairo-lib', which simplifies access
Cairo from external libraries. Documenting `racket/draw/unsafe/cairo'
might be better, but that's a lot more work.
The default is that hiniting is enabled, which causes some text
metrics (notably width) to be rounded to integer values, which makes
spacing more consistent. This default is backward-compatible. The
non-default 'unaligned mode refrains from rounding, which makes metric
information scale correctly and improves output for PS/PDF (such as
Redex output).
The `text' function from `slideshow/pict' defaults to
disabling hinting --- which is consistent with its default to combine
text instead of drawing character-by-character -- so slides and Redex
inherit the improvement.
* Get rid of the concept of `modspec': `getarg' now has `require' for
require specs and `module' for a module name (the latter is what all
previous uses of 'modspec except for ,require really needed); command
descriptions use "<require-spec>" and "<module>", documentation
adjusted as well.
* `module-name?' etc turn to `known-module' and `known-module-name',
with a saner behavior, and tests to keep it sane.
* This cleans up a lot of things. Two specific points: ,switch works
better with toplevel-defined modules (see the corresponding change in
the test suite), and also fixes PR 12148.
* Ensure that ,sh commands return void.
* Add tests for ,r with non-atomic require spec, and for use of $F in
,sh commands.
* Improved the test suite, including uses of `module+' so each file can
be run by itself to perform a subset of the tests.
pixel of space in between lines in DrRacket.
This change is based on Matthew's experience having a look
at the font setup on the three platforms.
He writes:
> * Mac OS X: the convention seems to be to add space between lines.
> TextEdit, for example, looks like DrRacket: the maze has spaces.
>
> (I can't find a font that makes the maze look right, actually, even
> if I adjust the line spacing.)
>
> * Windows: the convention seems to be that space is built into the
> font. DrRacket (and SirMail) draw lines more sparsely than Notepad.
>
> Perhaps consistent with the differing conventions, the height of
> "Courier New" at 11-pixel size is 14 on Windows, 13 on Mac OS X.
>
> * Unix: the convention seems to be to add space. DrRacket looks like
> the default Terminal and Text Editor programs on Ubuntu.
>
> The maze nevertheless looks right everywhere, because the glyphs
> extend an extra pixel above the declared bounding box!
This patch fixes the problem that the hole matcher may return an empty
list rather than a #f that gets sent to the caller of redex-match. I
re-ran the Redex tests and found no violations. However, I am not
confident that there isn't a more correct place to put this '() -> #f
replacement.
I will be immediately forwarding this push email to Robby to have him
check it.
- changed substitute to use closure-compilation
- added stress/perf test for templates
- updated minimatch with vector patterns
- split substitute into separate file, minimize dependencies
- do ellipsis optimization dynamically
- validate guides: check var indexes
It looks like run-teaching-program hasn't been touched in quite a while.
To begin with, the "rewrite-module" function used to add code to print
out values of non-define exprs, but this is no longer necessary. In fact,
the only thing that it does now is to discard "provide" statements, and
even this may be unnecessary. I rewrote big chunks of this (short) file
to introduce defines, eliminate unnecessary functions, and add stepper-
skip-completely annotations to the requires associated with teachpacks.
Also, it appears that the 'rep' argument to expand-teaching-program
was entirely superfluous; I removed it from the argument list, and also
from the three places in the main tree (deinprogramm, lang, and the stepper)
that call this function.
Let me know of any problems seen with teachpack requires....
* Modernize, improve, reformat, reorganize, etc.
* Use 'null as the default translation for json `null'. Add keyword
`#:null' arguments to control it, and a `json-null' parameter to
change the default. (Note that there is no ambiguity: symbols are
used in hash keys, and JSON restricts them to always be strings, so
`null' can never be a hash key.)
* Properly decode double \u-escape sequences (as UTF-16 surrogate
pairs).
* Add a keyword option to do more string encoding of all non-ASCII
characters.
* Rename `json->jsexpr' (and other way) to `string->jsexpr'. This is
because (a) after using it for a while I still can't remember which
side is which and a `string' in the name makes it clear, (b) it
follows the similar `xexpr' functions.
`port-success-k' is used in a single place, and instead of a simple
`lambda' expression it was used with (and ... (lambda ...)), which lead
to duplication of code. Instead, move the question into the
`regexp-loop' macro. (The compiled zo file is indeed smaller after this
change.)
Although th eoriginal idea was to distinguish "text" paths
from derived filesystem paths, practically everythign that accepts
a module path also accepts a path. Building the generalization into
`module-path?' makes it easier to support `submod' wrappers on paths,
and it seems to fix things rather than break them.
Before this commit, opening collects/drracket/private/unit.rkt required
about 17.5 megabytes of memory and after this commit, it is down to
about 15 megabytes.
The precise measurement I did was to create a frame and a scheme:text%
object in it, record the result of current-memory-use, open the file,
and record current-memory-use again.
For comparison, using a text:standard-style-list% object instead of
the scheme:text% requires only about 4.1 megabytes. One difference
being that there are about 3x more snips (10,204 vs 33,901 (after the
commit)), since we have one snip for each region that has a different
color in the scheme:text version, and the text:standard-style-list has
no colors and thus about two per line (there are 5006 lines in the
file).
The bug happens with n-ary uses of arithmetic operations that
have constant arguments but couldn't be constant-folded ---
maybe due to a divide-by-zero.
plots too small to render margin decorations (i.e. axis and tick labels) now render without them;
plots in frames now initially render with full detail
When uninitialized, turtles was giving a poor internal error.
Now it should tell the user to initialize. Also, added a note
in the docs about initialization.
Previously, sandbox creation used `gui?', which is the result of
`gui-available?' at the time that `racket/sandbox' is instanited.
This change makes sandbox behavior less sensitive tothe order in
which modules `require'd into a program are intiantiated.
The change depends on a new `sandbox-make-namespace' default
function for `sandbox-namespace-specs'. The new function uses
either `make-base-namespace' or `make-gui-namespace', depending
on whether the GUI library is available at that point.
A new `sandbox-gui-enabled' parameter can disable use of the
GUI library even if it is available.
The `gui?' binding is still exported for backward compatibility,
but it shouldn't be used anymore.
There are many SSL_() functions that produce return codes with more
information from SLL_get_error() and/or ERR_get_error(). Those need
to be grouped in an atomic section to ensure thread safety at the
level of Racket threads.
Using the functions on a port triggers renegotiation of the
connection, which s useful for cases such as a web server that
requires a certificate only for certain paths. This functionality
also allows better testing of the SSL library.
Read and write actions on an SSL port can trigger internal write
and read actions (i.e., the opposite direction). On the read side,
write pumping was performed too early before returning a "wait
for new input" event; SSL operations between the pumping and
return could trigger the need for pumping, but it never happened
because the socket was waiting for new input before taking any
new actions.
The problem would shows up specifically when Apache renegotiates
a connection to demand certificates from a client after first
determining the target of the request (i.e., when a certificate
is required ony for specific locations on the server).
Thenks to Sergey Pinaev, Timur Sufiev, and Neil Van Dyke.
them and use that to order 'raco setup'
The dep-list.rkt file contains code that reads .dep files
and computes the topological sort; this result is expected
to be copied over into setup-unit.rkt
Mostly for amusement, including the contrast between
the benefits of closure compilation for a host interpreter
versus the benefits for a host compiler.
The old implementation could cause deadlock by blocking on a semaphore
while waiting for the original place to run a callback, but a master
GC might be needed (and the blocked place wouldn't get the signal).
Beside fixing that problem, a potential memory leak is fixed in
calling an ffi funcition and having a Racket->C unmarshaling fail.
Also, the GC marking routine for a `place' value didn't reference the
place's underlying `place_obj' value.
The orange triangle is now updated after each turtle command. The erase
pen is now 2 pixels wide: before this, (draw 100) (erase 100) didn't
erase the line, but gave a grey line.
The eopl language is now racket-based rather than mzscheme-based. This
test-suite, which was originally distributed on the book's web-site has
been re-written in the new language. Changes include dropping all
drscheme-init.scm and top.scm files. Remaining files were renamed to
use the .rkt extension and edited to use the #lang syntax (instead of
modulue). Require and provide forms were changed to reflect racket's
syntax instead of mzscheme's (eg, only-in vs. only). Several
occurrences of one-armed ifs were changed to use when and unless. All
tests have been run successfully.
The bug is triggered by unsafe flonum operations, a
conversion that tries to make the arguments more unboxable,
and a `lambda' form within an argument to the unsafe
operation.
Closes PR 12587
- give names to user functions that matches the user's names
(if the third bullet goes away, then the function
mutator-lift needs to be adjusted so that it uses
procedure-rename in order to preserve the improvement
in this bullet)
- change exn? to exn:fail? (to avoid catching break exns)
- change lang so that primitives (the ones in the
provide-flat-prims/lift declaration) are not allocated
in the user's space (treat them as if they are constants)
This change makes it easier to build up and explain the
GC api, piece by piece. That is, you can first run a program
that contains just a constant (and explain it) with only a
subset of the api. Then you can do something like (+ 1 2)
and explain it, both without getting into how procedures work.
(This is helpful for the way I run my lectures)
The `or' and `and' functions already worked correctly; this
fix is for `or' and `and' as applied directly to arguments, which
expands to the `racket/base' `or' and `and' forms.
Treat a "face" as a font description only if it has a comma,
otherwise go back to treating it as a family name.
This change fixes the problem of parsing "Times New Roman"
as "Times New, Roman".
The ActiveX part of MysterX is gone. The `ffi/com' re-imeplemtnation
provides only core COM support.
The "mysssink" DLL is still needed, and its source is still
in the tree, but it is downloaded in the same way as other
pre-built DLLs. The DLL no longer needs to be registered with
regsvr32.
The prohbition against `handle-evt' on `handle-evt' is as
document and as originally intended. I'm not sure why it
was allowed.
Existing programs that use `handle-evt' incorrectly
can break. I found and fixed one incorrect use and one
questionable use in the Racket tree (which is a small
minority of the uses of `handle-evt' in the tree).
Extend `define-cstruct' to support #:property specs, which causes
the constructor and C->Racket coercsions to wrap the pointer in
a structure instance with the specified properties. Of course,
the wrapper structure has a `prop:cpointer' property so that the
wrapper can be used transparently as a C pointer.
Add missing tests and documentation for the id`->list', `list->'id,
id`->list*', and `list*->'id bindings created by `define-cstruct'.
so that printing an error no longer blocks (on user actions) but still
uses the GUI. Also: when new errors are generated while a dialog box
showing an error is still open, then just ignore those errors. Also,
if an error is generated that has been shown in the last 5 minutes, ignore
the new one.
When an eventspace is created, its thread implicitly calls
`yield'. It now effectively loops with `yield' and while
catching continuation aborts.
Closes PR 12566
This addition triggered several other changes:
* -k for a Mac OS X embedding is now relative to the __PLTSCHEME
segment (which means that executables won't break if you strip
them, for example)
* the command-line no longer has a limited size for Mac OS X
launchers and embedding executables
* Mac OS X GUI and Windows launchers record the creation-time
collection path, unless they are created as "relative" launchers
Use the system-supplied region to intersect with the
window region, so that drawng the border doesn't replace
the window content.
See also Kieron Hardy's post on the users' list, 2/7/12.
In particular, allow a pair of a relative-to directory and a base
directory. Paths that syntactically extend the base directory are
recorded as relative to the relative-to directory (which must
syntactically extend the base directory).
The compilation manager now sets the parameter to a pair with
the base directory as the main collection directory, if the source
file's path extends that directory's path.
This generalization solves problems created by cross-module inlining,
where the source location of a procedure in bytecode can now be in a
different file than the enclosing module's file.
Also add a test that checks whether the build directory shows up
in any ".zo", ".dep", or documentation ".html" files.
Closes PR 12549
The #:opaque keyword specifies that a class/c should be opaque.
An opaque class contract raises an error if the contracted class
contains any methods not mentioned in the contract.
included in the compiled files. (also, misc minor cleanups
notably a new exercise in tut.scrbl)
closes PR 12547 --- there are still a few uses left, but they do not
seem to be coming from Redex proper:
- /Users/robby/git/plt/collects/racket/private/map.rkt still appears
in a bunch of places (there is a separate PR for that I believe),
and
- /Users/robby/git/plt/collects/redex/../private/reduction-semantics.rkt
appears in tl-test.rkt, but I do not see how it
is coming in via Redex code, so hopefully one of the other
PRs that Eli submitted is the real cause. If not, I'll revisit later
To get the expected contents of the various environment variables, I
used a similar approach to what the build does in `grab_batch_vars':
* Start a cmd.exe shell (not a real shell)
* Dump the env into a buffer
* Run "... Studio/VC/vcvarsall.bat" (modifies envvars, which is why cmd
is needed)
* Dump new env into a new buffer
* Sort both buffers and compare
Hopefully it still works also on Matthew's setup.
Two other small things:
* Use ".obj" suffix on windows to avoid warning.
* Catch error when trying to delete the .so file, since on the x86_64
machine it throws an error. (I'm not sure how it *doesn't* do that
with the i386 machine.)
This change significantly increases the speed of number formatting, making extreme-bounds-tests.rkt run in about 1/4 the time.
Should consider moving these into racket/math, since floor-log/base generalizes order-of-magnitude.
detect if a (n online check syntax) rename would conflict with
an existing name. (This can happen because the remote place's
custodian gets shutdown due to, for example, another tab's online
check syntax running.)
can get "stale" and cause DrRacket to deadlock (this commit just sets
up some stuff to make one fix possible, but that fix doesn't seem to
be working, so the actual fix is disabled (see comment in commit))
Setting the environment variable causes the bytecode compiler to run
the bytecode validator (which is normally applied to input from a
bytecode file) immediately on all of the compiler's own results.
Certain `lambda'-lifting operations can cause information
about the flonumness of a variable to get lost, leading
to a mismatch between the closure's flags and flags on
a variable reference. (The bytecode validator could detect the
bug when loading the broken bytecode. The broken information,
meanwhile, was only used by the JIT.)
(Otherwise having both installed can be confusing since the uninstaller
has the same name; also, it's good to make a reminder for people who
want the other one.)
Also, just use the platform string in the registry key uniformly.
Also add a comment about detecting Win64 if it's desirable in the
future.
1. The contract in the docs was wrong.
2. The docs used `#f' where the code was expecting 'disable, so made it
accept both.
3. Don't recommend disabling the timer -- I had a case where the
connection was left for more than a day as a result. (Probably
because there was a message after the receipt email.)
Also, remove attempt for a smart use of `fmt' -- the problem is that now
"$platform" is not set, so the conditional didn't do anything. It would
be easy to get a conditional using `uname', but better to drop the whole
thing.
The two became tangled in commit f7c16fc8, and then 952ae06105
adjusted the tangling in a way that broke code. This commit
further adjusts tangling in a way that hopefully causes fewer
compatibility problems, but it also splits inputs to
`make-evaluator' so that a programmer can choose more explicitly.
coloring for blame assignment in check syntax) try to color
the right-hand side of a binding that actually comes from
a lambda-bound variable (and thus crash for not finding the
right-hand side)
Indexing index pages is harmless, and also "nofollow" is appropriate for
public lists with lots of junk, advertising etc. We have nearly zero
spam, so following links in posts is fine.
The generated code was checking arity after potentially copying
arguments to the start of the runstack (i.e., if the arguments
were not already there). If too few arguments are provided, then
the copy might access past the end of the given array.
The redundant arity check removed in commit f7c506471b
had previously masked this problem. (Or the check wasn't redundant
in that sense, but it's better this way.)
Merge to 5.2.1
Fixed faulty bilinear interpolation in shadow intersection, removed blurring hack
Fixed caching bug (for some reason, generate-temporaries didn't create a unique symbol - note, not *identifier*; used gensym instead)
Please merge into release
Split images/icons/misc into images/icons/symbol and images/icons/misc
Updated tests
Fixed Gtk assertion failure in Macro Stepper (came from "about" dialog being created before the stepper window was shown; fixed by creating it on demand)
Changed Stepper similarly (though there was no assertion failure)
Put a quote in the Macro Stepper logo
Portable recycle-icon
Removed recycle unicode from the docs (was causing PDF build to fail)
Internal API fixes
Please merge into release
* Avoid using readline on windows (segfaults, and anyway mostly not
useful)
* Don't try to read init file if it doesn't exist.
* Improve asking questions in the `install!' command.
Added lambda icon, foot icon, search forward/back icons
Doc fixes
Stepper: icons on buttons, logo and about dialog
Macro stepper: icons on buttons, logo and about dialog
Please merge into release
For the curious, this was an attempt to change the way context
matching works. Currently, when matching a pattern, if 'hole' is
encountered, the match succeeds and the result just includes the term
at that point. This means that when matching (in-hole p1 p2), p1
generally returns multiple results and then those results are thinned
out by matching p2 against the thing actually at the hole.
Instead, one could pass along the function that does the matching and
then, when matching a hole pattern, it could decide right at that
point whether or not the match works.
This seems like it would be a win overall, but it interferes with
caching. Specifically, most reduction systems have lots of rules
that all begin
(--> (in-hole E ...) ...)
and, in the strategy first described above, that matching can be cached.
But in the second, it cannot. Overall, this turns out to be a slight
lose in the current version of Redex. Maybe if other things change, however,
this tradeoff will change.
Revert "IN PROGRESS: more context speedup attempt"
This reverts commit 0134b8753d.
Revert "IN PROGRESS: a possible speed up attempt; match the thing in the hole before returning the context matches instead of afterwards"
This reverts commit 11059e2b5c.
* The darwin build on kauai (the machine is no longer maintained, and
has no cairo installed).
* The two debian builds (also no cairo).
* Remove comment from osx64 build (which is now done on Robby's
machine).
More documentation (Now contains an animated GIF! We have achieved Web 1.0!)
Fixed stop sign double-rendering bug
Compiled logos size 256 (no rendering time for sizes < 256; intended size almost instantaneous)
Please merge into release
Began scribble docs
Added `compiled-bitmap' and `compiled-bitmap-list', which embed bitmaps
computed at expansion time into compiled files (safe 3D values)
Please merge into release
There's no particular reason that any one format will have all
the information that other formats need, but it conveniently works
for now that HTML info can subsume Latex info.
Certain unsafe operations were allowed to propagate across a
`lambda' boundary (where space safety is known not to be an issue),
which could lead to duplicate uses of a "once used" variable if
the relevant `lambda' is inlined.
Furthermore, `lambda' boundary crossing wasn't detected in the case
that the operation to propagate was propagated through an intermediate
variable without a `lambda' crossing.
Merge to 5.2.1
Redex no longer has extra checks to eliminate redundant matches
(as those checks are prohibitively expensive for the lambdajs model)
so redundancy in the grammar can, when combined with context
decomposition or named patterns, lead to significant slowdowns
This removes all the SVG sources, parsing, and marked-layer colorizing, the PNG binaries in the distribution, and the dependence of DrRacket on `slideshow/pict'.
Icons are now produced by drawing on a bitmap-dc%, inferring or building a z map, choosing a material, and sending these to a two-pass ray tracer. This is for the most part hidden behind an API consisting of functions from colors and optional sizes and materials to `bitmap%'s.
Contracts and documentation forthcoming.
Previously, if a dispatched build failed the files from the previous
build would still get copied. This was an intentional feature, since
only the compiled binaries of these builds are used, and usually these
would work fine (with the zo files that were built on the main machine).
Now, the build directory is deleted when starting, which means that any
failure in a remote build means that the whole build will fail. This
turns out to be better since when there are problems, the previous
behavior could be very confusing. In addition, the racket setup itself
rarely fails, so this won't make a difference.
* Use `ssh' to copy the repo tgz, so it can also create the build
directory in a single connection.
* Use "racket" in the build materials directory name (since it's used in
random machines).
* Use `chcon' to make files accessible to the web server under selinux.
* "YYYY-MM-DD HH:MM" in log time strings (leave the one on the web page
as is).
* Uniform machine+platform labels in headers on dispatched builds. The
main build machine doesn't have them.
On dispatched builds the status is printed in their own logs in a
greppable way, and these lines are removed when these logs are displayed
as part of the main log.
be a frame and react to changes in focus of the main drracket window.
didn't finish because there does not seem to be an equivalent to
on-subwindow-focus that lets the frame detect when one of its
children gets the focus.
related to PR 12474
There is a big comment in thread.rkt that explains the problem and the
"fix". I think something better could and should be done, but I don't
know what it is.
This speeds up the lambdajs model considerably because the computation
to determine duplicates is expensive and no duplicates are really
ever dropped (and, in general, I think that duplicates will only
be dropped when the grammar is ambiguous; so maybe a better thing
is to just rewrite the grammar when that happens)
when one hole has been found
This improves the lambdajs model example's running time, presumably
because the hole is generally found near the "beginning" of the
term
Instead of using a hash-table, use the equal-hash-code directly;
this lets me evict entries only when they clobber each other,
and generally keep good cache utilization.
Also, cut the cache size by a factor of 5 while still having a
slight performance improvement on the r6rs test suite benchmark.
On that same benchmark, there are 1714812 misses in the cache, but
only 3485 times is an entry in the cache clobbered
have any holes, hide-holes, or names and, in that case, just
combining booleans instead of building of mtch structs.
This does seem to work on a simple benchmark. The code below
gets about 6x faster. But on the r6rs test suite, there is
no substantial change (possibly because the caching obviates
this optimization?)
lang racket/base
(require redex/reduction-semantics)
(caching-enabled? #f)
(define-language L (e (+ e e) number))
(define t
(let loop ([n 100])
(cond
[(zero? n) 1]
[else `(+ 11 ,(loop (- n 1)))])))
(define f (redex-match L e))
(time (for ([x (in-range 1000)]) (f t)))
When I enabled this, I don't see any speedup, on the R6RS test suite
benchmark (I see minor slowdown). Here are the numbers I get, on my
laptop:
nt cache: 35537 msec
neither: 844933 msec
Jay's idea: 875306 msec
And with both on, I see a similar, minor slowdown (as compared to the
version with the nt cache).
The main difference seems to be that I'm getting about 6 "hits" per
test case on the nt-match structs (that is, I avoid work by finding an
nt-match struct) and I'm getting about 8,800 hits in the cache per
test case.
This covers all of the html files in mailman's template directory, and
we should have a consistent look for all pages. (Including archived
messages.) Also tweak the front page to have a link to the mailman
"listinfo" page with the complete list of the hosted mailing lists.
Add a `resource/referrer' abstraction for referrers, on top of plain
resources. (When the referrer is `values', it just returns the plain
resource.) Also add `url-of' to replace `get-resource-path'.
This turned out to be a bad idea. The thing is that some resources need
to be referred to in multiple ways -- for example, different texts in
links of different kinds, or using the URL directly in some cases. The
existence of `get-resource-path' is a witness for this problem, since it
was used for such cases -- this function is removed as well.
There's no point in trying to generalize this here: instead, go back to
a simpler system where a resource always returns its URL (with an
optional argument to get an absolute URL). When a `referrer'
functionality is needed, build it on top of that, in a place where it
makes more sense. (That is, in a specific code for generating content,
where there could be a decision that resources have plain links and also
a very short link for use in navbars.) Otherwise, it's usually simpler
to just define resources and referrers separately (as different
bindings, the latter uses the former).
Turns out that bash's regexps (using `=~') changed so that quoting them
matches a literal string, and it seems dangerous to rely on parsing
unquoted regexps. One way around this is to put the regexp in a
variable, but for the two simple uses that this script had, it's easy to
avoid regexps completely.
redex patterns a bunch:
- repeats are turned into wrappers in sequences,
- names are all explicit,
- non-terminals are wrapped with `nt',
- cross patterns always have the hyphens in them.
- ellipses names are normalized (so there are no "hidden"
name equalities); this also means that repeat patterns
can have both a regular name and a mismatch name
Also, added a match-a-pattern helper macro that checks to make sure
that functions that process patterns don't miss any cases
to be a hierarchical-list-item<%> object, but now it is
a list of language names (same information, different data)
and one place didn't get updated.
Closes PR 12462
the purpose of drawing arrows.
The computation to fill in the cache seems to actually be pretty quick and
the work to clear the cache when it is out of date (via a call to on-change)
can be substantial on big files, so just not maintaining the cache seems better.
(there are 7254 arrows in drracket/private/unit.rkt, stored in an interval map,
and iterating over the interval-map in a for loop seems to be time consuming)
Also, DrRacket could get into a state where switching tabs would trigger a
call to on-change, which means that switching tabs would take a few seconds.
Using the old extension protocol for MysterX --- plus the hack of
a dummy source module for a kind of portability --- really should
be replaced with an FFI-based approach to the MysterX DLL.
* In base64 encoding remove all newlines from the encoded result, avoids
getting an invalid result.
* In qp encoding:
- replace all spaces by underlines, not just the first (looks like a
typo in the previous code)
- encode "?"s and "_"s too, as required for this encoding
- remove soft newlines (again, avoid an invalid result)
* Use `regexp-replace*' to encode the parts between the lines. Besides
making the code simpler, it fixes a bug in the previous code where
multiple lines would each get encoded and the results concatenated
without the newlines or any other whitespace.
* When the string to be encoded is longer than 70 characters, split and
encode the sub-parts, then concatenate the encodings with a "\n "
separator. This is done as a poor attempt to follow the line length
limits specified in rfc2047, or more concretely, to avoid sendmail's
"!\n " splitting.
* Use `re:non-ascii' to look for a non-ascii character => faster.
* Use either CR or LF for a newline, not just LF.
* Use `regexp-replace*' to encode the parts between the lines. Besides
making the code simpler, it fixes a bug in the previous code where
multiple lines would each get encoded and the results concatenated
without the newlines or any other whitespace.
There might be existing uses of `net/sendmail' that did this quoting
since this code didn't do so. Such uses would continue to work fine,
since quoted strings would already be plain ASCII, so a second quoting
would leave it as is.
Note that the quoted strings are also used as command line arguments.
It seems that sendmail deals with these all fine when they appear as
command line arguments. This means that any valid email address format
can be used, not just "raw" emails. If there are some sendmails that
don't do this, then it would be better to add a `-t' flag to let
sendmail parse the text in the message.
One caveat (not a new one): since they're passed as is, it is possible
to use two emails in a single string, as in "a@b.com, c@d.com". This
could lead to obvious problems if someone uses "Bar, Foo <foo@bar.org>"
instead of "\"Bar, Foo\" <foo@bar.org>". (Using a `-t' to parse the
content won't help with that...) The only way to avoid this would be to
parse the emails and quote the name part if needed. But that's a much
hairier piece of code.
* Move the `X-Mailer' header to the top, so that the interesting headers
are all together at the bottom (the top gets littered by server
headers anyway).
* Use `subprocess' directly (`process*' wasn't really doing anything
more than that).
* Allow the sender to be `#f', leaving the header out. This makes all
sendmails that I've used use the username that is running the process.
* Just search for a sendmail program: don't barf on windows, so it can
be used in case there is a sendmail.exe executable there.
* Remove `no-mail-recipients' to make it in-line with other racket code
that doesn't raise super-specific exceptions.
* Use port counting instead of doing the counts manually, much simpler
code.
Namely, not the singular record signature, but the signature
constructors of `define-record-procedures-parametric'.
(We'd done this before, but that patch got reverted, without the
doc part getting reinstated.)
Such as this, submitted by Torsten Grust:
(define-record-procedures-parametric stream_ stream-of
make-stream
stream?
(stream-head stream-tail))
(define stream
(lambda (t)
(signature (stream-of t (-> (stream t))))))
(: from (number -> (stream number)))
(define from
(lambda (n)
(make-stream n (lambda () (from (+ n 1))))))
(: foo (stream number))
(define foo (from 1))
The problem was that the arbitaries got evaluated too eagerly.
the state that online check syntax uses (indirectly via scribble)
to lookup documentation.
since the kill-safe abstraction moved some computation over to
another thread, the values of various parameters (current-directory
in this case) were not preserved. So when scribble then ended up
resolving a module path with the wrong current directory, this
bad value got cached. Then later, when check syntax tries to figure
out what file to open to jump to it, it got the cached bogus value
(even though current-directory was right when check syntax asked
for the filename).
closes PR 12538
Rename `read-intern-literal' to `datum-intern-literal'.
Interning is needed only in `read-syntax' or `datum->syntax' to
set up the invariants that the bytecode compiler needs for cross-module
optimization. When `read'ing numbers from a data file, meanwhile,
interning slows things down a lot and doesn't seem worthwhile.