Opened 6 years ago
Closed 6 years ago
#1623 closed enhancement (fixed)
Avoid consing for optional procedure arguments
| Reported by: | sjamaan | Owned by: | sjamaan |
|---|---|---|---|
| Priority: | minor | Milestone: | 5.2 |
| Component: | compiler | Version: | 5.0.0 |
| Keywords: | Cc: | ||
| Estimated difficulty: | medium |
Description
Currently, anything that accepts optional, rest or keyword arguments has to build a list and then pick that list apart. This is wasteful because it should not be necessary at all.
We could start with the low-hanging fruit like case-lambda and #!optional, where the binding of arguments and argument count checking is relatively simple. Handling #!key and #!rest or dotted tail rest argument notation is something that seems to me either too difficult and possibly not even worth it: you usually want to treat those as a list (but patterns like optional could still be handled specially, if nothing else refers to the identifier).
Attachments (2)
Change History (8)
comment:1 Changed 6 years ago by
| Summary: | Implement faster vararg procedures → Avoid consing for optional procedure arguments |
|---|
comment:2 Changed 6 years ago by
| Version: | 5.0.0rc1 → 5.0.0 |
|---|
comment:3 Changed 6 years ago by
| Milestone: | someday → 5.2 |
|---|
comment:4 Changed 6 years ago by
| Milestone: | 5.2 → 5.3 |
|---|
Changed 6 years ago by
| Attachment: | 0001-Replace-car-cdr-null-on-rest-args-with-direct-argvec.patch added |
|---|
Final version including explanatory commit message sent to the mailing list
comment:6 Changed 6 years ago by
| Milestone: | 5.3 → 5.2 |
|---|---|
| Resolution: | → fixed |
| Status: | new → closed |
This has been implemented for #!optional, let-optionals* and also case-lamdba. There might be room for improvement (as always), but for now I feel we've done enough; the approach we use even makes manual accesses of rest arguments optimisable, depending on the exact pattern used, of course.

Moving to 5.0.0 just to keep the listings tidy.