<?xml version='1.0' encoding='utf-8' ?>

<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>Sunt Lacrimae Rerum</title>
  <link>https://jsburbidge.dreamwidth.org/</link>
  <description>Sunt Lacrimae Rerum - Dreamwidth Studios</description>
  <lastBuildDate>Sun, 24 May 2026 20:28:50 GMT</lastBuildDate>
  <generator>LiveJournal / Dreamwidth Studios</generator>
  <lj:journal>jsburbidge</lj:journal>
  <lj:journaltype>personal</lj:journaltype>
  <image>
    <url>https://v2.dreamwidth.org/11859976/2875401</url>
    <title>Sunt Lacrimae Rerum</title>
    <link>https://jsburbidge.dreamwidth.org/</link>
    <width>100</width>
    <height>100</height>
  </image>

<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/128582.html</guid>
  <pubDate>Sun, 24 May 2026 20:28:50 GMT</pubDate>
  <title>Another misuse of AI</title>
  <link>https://jsburbidge.dreamwidth.org/128582.html</link>
  <description>&amp;nbsp;One of the signs of the progress of AI through some areas is the visible degradation of what has before been, not great, but at least competent. Sometimes one sees signs of this where one least expects it - though in retrospect it is certainly something one should have expected.&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Like most technical people who have a LinkedIn profile I reasonably regularly get relatively random e-mails (originating as messages on LinkedIn) from recruiters who want to know if I might be available for a position.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Usually these are not very good matches. People who promote positions with required skills that appear nowhere on your CV because you do development work in the financial sector are executing the equivalent of a Hail Mary pass by spamming a long list of targets which are marked with only general tags in a context where good matches are hard to find. However, they are humanly understandable queries. They read like form letters, but they contain concrete details which show that a human mind was behind at least the general form of the template, or they are clearly a standard form that was broadcast to a large mailing list.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Recently I&apos;ve had a trickle of something else. They come from real recruiters - i.e. not scammers -  who have several years in their positions and have a reasonable history on LinkedIn. But the texts look different.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;They don&apos;t have any information about the client, or position, in question.  If it weren&apos;t for the background of the senders, this would lead me to suspect scam attempts. (Those usually offer very vague positions, frequently &amp;quot;at the executive level&amp;quot;, to people with skillsets that in no way would match the offered position.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;What they do have is details scraped from my CV scattered through the first paragraph or two. But the details don&apos;t quite fit, semantically.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Consider &amp;quot;I&apos;m reaching out on behalf of our client who is looking to bring on board an Engineer II. They are impressed by your background in application development&amp;quot;. Nobody wants to bring an Engineer II on board; that&apos;s an internal title at TD with no meaning outside that context.  What they would want would be a senior software developer. Likewise, from the same email &amp;quot;Your expertise in C/C++/C# and work on transaction processing really caught their attention&amp;quot; just isn&apos;t what anyone would say. Nobody actually wants all three of C, C++, and C#; if they aren&apos;t interested in only one, it will be C/C++ (for optimized close to the metal development, or large legacy codebases) or C++/C# (enterprises with large blocks of both in their current codebases). Plus, clients don&apos;t recommend candidates to recruiters; it goes the other way, and recruiters don&apos;t let them know about you until you have expressed interest.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Or consider, from a different e-mail &amp;quot;Our client is currently hiring for a position that aligns with your skills, particularly in Unix and Software Development.&amp;quot; That&apos;s not how anyone would promote a position. A sentence like that requires really concrete, and usually slightly rare, skills for it to make sense. If you replaced &amp;quot;Unix and Software Development&amp;quot; with something like &amp;quot;LALR Compiler design&amp;quot; the sentence would make sense, even if it still sounded rather buzzwordy and vague. Usually, the recruiter aiming at a senior hire focusses on describing the position, not the applicant, something like &amp;quot;Our client is expanding their automated trading system on a C++/Linux platform and needs several strong team leads to spearhead the project&amp;quot;.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;These are, of course, AI generated. Established recruiters who used to spend days identifying and contacting candidates for their clients are now clearly telling AI agents to generate &amp;quot;personalized&amp;quot; contact letters for matches from probably AI-driven searches and then sending them out without doing any sort of detailed editing. And those e-mails are almost indistinguishable from scam e-mails, because the generalization characteristic of AI slop wipes out the sorts of concrete details which used to reflect the attention recruiters had to pay if they wanted to get placements. With this approach, the recruiter can replace quality (such as it was) with quantity.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;I don&apos;t think it will work. The problem with this sort of use of AI is that the hit taken from sounding &amp;quot;off&amp;quot;, even very slightly, and by poor coordination of detail, will drive off more potential applicants than you might gain from being able to spam more such targets.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=128582&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/128582.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/128493.html</guid>
  <pubDate>Tue, 14 Apr 2026 00:24:10 GMT</pubDate>
  <title>Notional SF Course</title>
  <link>https://jsburbidge.dreamwidth.org/128493.html</link>
  <description>&amp;nbsp;I have posted before about the question of an &amp;quot;SF Canon&amp;quot; (brief summary: there isn&apos;t one in the standard sense of the word).  I don&apos;t think that thinking in terms of a canon is useful in addressing how we should be thinking in terms of major SF works.&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;One problem is that the number of speculative fiction books has ballooned since my own Golden Age of Science Fiction, and in particular the production of novels of good quality has expanded.  There are many, many authors who never appear on Hugo nomination lists or equivalent forms of recognition, but whose work consistently is better at a nuts and bolts level than most of the SF from, say, the 1960s.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;(Some novels are important without being technically good.  Asimov and Clarke (and Smith, &amp;lt;i&amp;gt;a fortiori&amp;lt;/i&amp;gt;) are important in the history of SF as a literature of ideas (for a subset of &amp;quot;ideas&amp;quot;), but their characterization is flat, and their prose is, at best, adequate.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;An alternative approach might be to ask: what might one read to provide a reasonably wide window (though not exhaustive) for a modern reader? (That is, in effect: what would make a good SF course, not from an academic point of view (which would focus on roots) but for someone who wants to finish the course well-prepared for a visit to an SF store.) Such a list will be biased away from a canon of classics, because current work can be presented as representing the works influencing it. It will include some still-popular older works, though.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Such a course would be restricted only to Science Fiction (although happily including some grey zone works, as this isn&apos;t about notional purity), as a similar course for fantasy would be largely disjoint. A generalized Speculative Fiction course would be twice the size and lack focus.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;To illustrate, I have pulled together such a notional course, grouped into 7 subgroups. Even though it skips over many works I would like to include, it is still substantially longer than the reading list for a normal undergraduate university course (usually one book per week for twenty weeks).&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;1) Foundations&lt;/div&gt;&lt;div&gt;Asimov, I, Robot, &amp;quot;Nightfall&amp;quot;&lt;/div&gt;&lt;div&gt;Heinlein, The Past Through Tomorrow (selections)&lt;/div&gt;&lt;div&gt;Clarke, &amp;quot;The Nine Billion Names of God&amp;quot;, Childhood&apos;s End, &amp;quot;The Sentinel&amp;quot;&lt;/div&gt;&lt;div&gt;Zelazny, Lord of Light&lt;/div&gt;&lt;div&gt;Le Guin, The Dispossessed&lt;/div&gt;&lt;div&gt;Niven &amp;amp; Pournelle, The Mote in God&apos;s Eye&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;2) Cyberpunk and computers&lt;/div&gt;&lt;div&gt;Gibson, Neuromancer&lt;/div&gt;&lt;div&gt;Stephenson, Cryptonomicon&lt;/div&gt;&lt;div&gt;Moran, The Big Boost&lt;/div&gt;&lt;div&gt;Vinge, A Deepness in the Sky&lt;/div&gt;&lt;div&gt;Morden, Equations of Life&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;3) Societies&lt;/div&gt;&lt;div&gt;Harkaway, Gnomon&lt;/div&gt;&lt;div&gt;Stephenson, Anathem&lt;/div&gt;&lt;div&gt;Mandel, Station Eleven&lt;/div&gt;&lt;div&gt;Robinson, New York 2140&lt;/div&gt;&lt;div&gt;Older, Infomocracy&lt;/div&gt;&lt;div&gt;Palmer, Too Like The Lightning&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Definitionally, speculative fiction in general is well-suited for presenting social models different from our own, or for fiddling with the failure modes of our own social model. Frequently, authors fall down hard enough on this that they risk triggering a failure of suspension of disbelief (much as historical novel authors who present characters five hundred or more years ago who behave as they would in the present day).  But there are novels which do tackle this challenge. The simplest model is the dystopia, represented here by *Gnomon*, which itself has links to *1984*.  Post-collapse fiction is probably the next most popular form (*Station Eleven* being a particularly successful instance, though Miller&apos;s *A Canticle for Leibowitz* would be an equally good example.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Robinson, Older, and Palmer all provide variant views of the near future; the Stephenson goes further and presents an *alternative* form of social organization in a parallel universe.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;4) Space Opera&lt;/div&gt;&lt;div&gt;Weber, On Basilisk Station&lt;/div&gt;&lt;div&gt;Cameron, Artifact Space&lt;/div&gt;&lt;div&gt;Martine, A Memory Called Empire&lt;/div&gt;&lt;div&gt;Leckie, Ancillary Justice&lt;/div&gt;&lt;div&gt;Stross, Saturn&apos;s Children&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;5) Time Travel&lt;/div&gt;&lt;div&gt;Niven, &amp;quot;The Theory and Practice of Time Travel&amp;quot;&lt;/div&gt;&lt;div&gt;Bradbury, &amp;quot;A Sound of Thunder&amp;quot;&lt;/div&gt;&lt;div&gt;Finney, Time and Again&lt;/div&gt;&lt;div&gt;Willis, To Say Nothing of the Dog&lt;/div&gt;&lt;div&gt;Wilson, The Chronoliths&lt;/div&gt;&lt;div&gt;Hogan, Thrice Upon a Time&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;6) First Contact&lt;/div&gt;&lt;div&gt;Erikson, Rejoice, A Knife to the Heart&lt;/div&gt;&lt;div&gt;Watts, Blindsight&lt;/div&gt;&lt;div&gt;McDevitt, Ancient Shores&lt;/div&gt;&lt;div&gt;Corey, Leviathan Wakes&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;7) Just Plain Weird&lt;/div&gt;&lt;div&gt;Shea &amp;amp; Wilson, Illuminatus!&lt;/div&gt;&lt;div&gt;Moxon, The Revisionaries&lt;/div&gt;&lt;div&gt;Mi&amp;eacute;ville, Embassytown&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=128493&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/128493.html</comments>
  <category>sf/fantasy</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/127940.html</guid>
  <pubDate>Tue, 06 Jan 2026 00:44:49 GMT</pubDate>
  <title>&quot;Math Emergency&quot;</title>
  <link>https://jsburbidge.dreamwidth.org/127940.html</link>
  <description>&amp;nbsp;The Globe and Mail thinks that Ontario is in the throes of a math emergency.&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;What I see elsewhere indicates that we aren&apos;t particularly out of the pack of the rest of the western polities regarding the maths performance of young people.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;From where I stand we&apos;ve always handled mathematics badly - and a return to the basics of drilled arithmetic seems to me a prescription which in no way suits the current situation.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;I was in elementary school at the height of the New Math period, so we got some very, very early exposure to the idea of algebraic structures like groups (they then mainly went away again until university, with the odd few-week refresher along the way - modular arithmetic in Grade 6, for example, and maybe a bit of rings and fields at some point in Grade 13 Algebra). Other than that, grades 1-4 were largely taken up learning addition, subtraction, multiplication and division, and grades 5-8 solving problems using those operations. Only in high school did we progress to algebra (well, polynomials), functions, and the like.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;In retrospect, it is clear that the driver of maths in school was not the subject in itself. In primary school, everything was really focussed on giving everyone the practical skills they needed to survive - make change, go over home accounts, estimate work to be done, handle recipes - which explains the otherwise insane emphasis not only on word problems but on problems using the more obscure relics of the Imperial system (I don&apos;t think we had to deal with hides) to encourage fluency through arduous practice. In high school, it was the subset of math useful if you were going to be a chemist, engineer, or possibly (at the low end) a sociologist or an accountant.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Ghosts of this sort of thing remain - the current Grade 9 science curriculum wants to talk about energy in kWh rather than joules (or, worse, electron volts) because the bulk of the students will have to deal with appliances and few will become physicists or chemists.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The high school maths curriculum in Ontario was driven by what was required for science and engineering (whence the choice of Cartesian rather than Apollonian conic sections) or for accounting (Grade 13 Relations and Functions, the course people took even if they didn&apos;t want to be scientists, engineers, or mathematicians, had a large block of calculating annuities and present value, which is still there in Grade 12 functions). A systematic treatment driven by what a mathematician would see as important or even interesting was brushed aside.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;To a close approximation we have never taught mathematics as a discipline in our schools. (And if we had, few would have prospered at it, though possibly more than currently become serious mathematicians.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Of course, much of this has been blown away by the prevalence of calculators and Excel (and now by AI which can do your factorization homework for you, albeit unreliably), and I don&apos;t think that the Ministry or OISE worked out how to respond, looking at my daughter&apos;s curriculum of a few years ago. My own advice would be to have long units covering things systematically, with more (real) algebra and geometry, as I think that that&apos;s the best way of bringing out the appeal of mathematical systems; and even slow students would be aided by longer treatments of connected ideas rather than the flitting from topic to topic they now get in elementary school.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Except for one thing. Some significant chunk of the population has a nearly complete inability to think abstractly, and true mathematics is almost as abstract as it gets. (Not quite; there is always philosophy. For real abstraction, go to Duns Scotus.) The old curriculum&apos;s math was entirely concrete: here are mechanisms for multiplication and long division: memorize the times tables by brute force and you can mechanically apply the rules whether you understand them or not.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Concrete math is now considerably lightened as a burden. You still have to understand some things - back of the envelope estimates to know when you&apos;re wildly wrong, and what the various Excel functions actually do so that you can deploy them intelligently - but most actual work is carried out by, essentially, moving around building blocks.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;It&apos;s not that we can simply dispense with classical arithmetic.  It&apos;s the most generally useful part of mathematics, and having a basic understanding of it is basic to some skills we really could benefit from having the broad population know. (Decent evaluations of risk, for example. Humans are crap at risk evaluation and have to learn it carefully, beginning with Bayesian probabilities.) But accepting the fact that about half the population isn&apos;t likely to get beyond that, and maybe deciding, once and for all, not to hold back the competent students in favour of Deweyan group promotions might be a more important step than panicking about a &amp;quot;math emergency&amp;quot; we share with most of the rest of the developed world.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=127940&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/127940.html</comments>
  <category>education</category>
  <category>mathematical literacy</category>
  <lj:security>public</lj:security>
  <lj:reply-count>6</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/127668.html</guid>
  <pubDate>Fri, 02 Jan 2026 01:58:11 GMT</pubDate>
  <title>Making a Dunce of Yourself</title>
  <link>https://jsburbidge.dreamwidth.org/127668.html</link>
  <description>&amp;nbsp;There is a pattern I&apos;ve seen in several contexts regarding book reviews. I&apos;m going to take two examples (one extreme, one less so) and then discuss the general thing.&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;First:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;There is really no actual debate among those who have read it for over three centuries that Swift&apos;s &lt;em&gt;Tale of a Tub&lt;/em&gt; is a work of genius; even Swift looked back on his younger self enviously. As a satire on the &amp;quot;moderns&amp;quot;, the Dunces of Pope&apos;s later terminology, it operates at every level at a high level of brilliance, generating chaos as an effect of its progress. It uses a mechanism which, watered down somewhat, eventually gives us Lemuel Gulliver.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;LibraryThing presents us with a set of one or two star reviews by readers who couldn&apos;t get it.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;When you are reviewing a book which three centuries have declared a work of genius, assigning it a rating of two stars (or, actually, anything less than five) reflects negatively on you and not the book. It&apos;s like complaining that Virgil should have written in simple modern English: the major problem (in the context of the existence of modern readers who still find delight in the work) is that the reader did not equip him or herself to deal with the disconnection of three centuries of cultural drift. The work is objectively a five star work, and the most you can say is that this age, if it produces fewer people who can read it as well-equipped readers, may be failing somewhere in its education.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;This isn&apos;t just about time, although time enhances the disconnect. Some great books are more difficult than others from the beginning (Virgil being the literally classic example). It&apos;s folly to try to assess The Cantos if you have no grasp of cultural history.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;But this doesn&apos;t apply only to actually great works, or only to older works.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Second:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;I will take an author and work who will be nameless for this purpose: what you need to know is that the work in question is (a) recent; (b) full of detail; (c) fairly widely acclaimed by readers and reviewers, not as a masterpiece, but as an enjoyable, well-written work with decent style and interesting characters. My own observation is that it&apos;s the sort of work that&apos;s driven by an accumulation of realistic details (some reflecting the author&apos;s personal experience) which drive the overall narrative but do require an effort to hold the whole thing in your head while reading it. I turned to it immediately after reading another popular work, hailed as &amp;quot;utterly brilliant&amp;quot; in a published review which was part of my feed this morning, by a successful author whose work has different virtues, and kept being surprised by how effective the accumulation of concrete details was by contrast.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;There are several reviews by people who assign one star and a DNF rating because they either didn&apos;t like the characterization, or had no interest at all in the details that knit it together.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;It&apos;s less obvious here than in the case of Swift, because there isn&apos;t the witness of centuries staring you down, but posting this sort of assessment is a negative evaluation of yourself rather than anything else.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;It&apos;s fine for the reviewer - especially the professional reviewer, who gets assigned books to review - to say of a given work &amp;quot;Those who like this sort of thing will like this&amp;quot;, admitting their own lack of sympathy with the matter at hand. But note that this goes along with an acknowledgement of an incapacity to write a fair review. (Unless the reviewer makes their own taste the arbiter of all things; in which case we are getting perilously close to the parody version of F.R. Leavis pilloried by F. C. Crews as Simon Lacerous.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Nobody likes everything. I dislike the literary tradition descending from Jane Eyre and would not review a work in that tradition unless I found unexpectedly positive things to say about it.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;This isn&apos;t, note, about popularity. There are bestsellers which are trash, and any brief analysis will show why. Dan Brown and the Left Behind series are reminders that sometimes there&apos;s no there there behind a vastly popular work other than an ability to pile up incidents in such a way as to keep the reader turning the page with their critical faculties turned off.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Negative reviews have a place. This is especially true of reviews of non-fiction books which get fundamental things wrong, or avoid inconvenient facts. And letting people know what &lt;em&gt;The Da Vinci Code&lt;/em&gt; is like to save them the cost - if only in energy - of finding out is a public service, though even there that amounts to categorizing it as a known type of bestseller.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;But where argument comes down to the type of text, and where the reviewer clearly has an antipathy to a type of text which is accepted by equally-critically-equipped reviewers with different tastes, maybe it&apos;s better just to keep quiet and let those who appreciate a text talk about it. De gustibus non est disputandum.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=127668&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/127668.html</comments>
  <category>reviews (meta)</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/127249.html</guid>
  <pubDate>Mon, 29 Dec 2025 00:38:51 GMT</pubDate>
  <title>Lewis Theobald and the Editing of Shakespeare (Peter Seary)</title>
  <link>https://jsburbidge.dreamwidth.org/127249.html</link>
  <description>&amp;nbsp;This is, in a way, an answer to &lt;em&gt;The Dunciad.&lt;/em&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;In a way, Pope&apos;s judgement in that last volley in the &lt;em&gt;Querelle des Anciens et Modernes&lt;/em&gt; is inerrant: he&apos;s correct in seeing the new world of Theobald and Bentley as a rejection of what had been, until that point, the agreed-on values of culture and civilization. In place of a reading of Attic and Augustan texts as a guide to a baseline for culture, we have instead&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;To sound or sink in cano, O or A,&lt;/div&gt;&lt;div&gt;Or give up Cicero to C or K.&lt;/div&gt;&lt;div&gt;Let Freind affect to speak as Terence spoke,&lt;/div&gt;&lt;div&gt;And Alsop never but like Horace joke:&lt;/div&gt;&lt;div&gt;For me, what Virgil, Pliny may deny,&lt;/div&gt;&lt;div&gt;Manilius or Solinus shall supply:&lt;/div&gt;&lt;div&gt;For Attic Phrase in Plato let them seek,&lt;/div&gt;&lt;div&gt;I poach in Suidas for unlicens&apos;d Greek.&lt;/div&gt;&lt;div&gt;In ancient sense if any needs will deal,&lt;/div&gt;&lt;div&gt;Be sure I give them fragments, not a meal...&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;For Pope, Theobald represents the same model as applied to modern culture; a reduction to meaningless details.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Yet in a very real way Pope takes a stand on a hill with a weak foundation. He takes it for granted that the key to effective reading is the application of innate good taste. As a corollary, he rejects the need for expertise to determine issues which are no longer (or perhaps never were) obvious.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Theobald introduces to the study of Shakespeare an attention to details of the past which has started to be applied to classical authors. In doing so he not only is part of an ongoing assimilation of Shakespeare to the status of a classical author, but a key player in a transition where scholarship tries to work with the works of the past on their own terms. In the future to which Theobald points are the editions of (for example) Malone. (It really does matter how we pronounce the poetry we read if we want to understand how the author meant his effects. Recovering the digamma does affect our understanding of Homeric scansion. And understanding Shakespeare in terms of his own time shifts him from a &amp;quot;natural&amp;quot; poet whose roughnesses are imperfections to be elided away by emendation to an accomplished writer on his own terms whose linguistic frame was different from that of the 18th Century.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The argument of the book, well supported, is that Theobald was not a dunce, and deserves a refurbishment of his reputation.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=127249&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/127249.html</comments>
  <category>reviews</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/127193.html</guid>
  <pubDate>Thu, 25 Dec 2025 20:20:37 GMT</pubDate>
  <title>Katabasis (Kuang)</title>
  <link>https://jsburbidge.dreamwidth.org/127193.html</link>
  <description>This book does a switch in models as it moves along, although it becomes evident only at the end.&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;There are two different traditions of stories about dealing with the dead. the first is the set of Ishtar - Demeter - Orpheus - Heracles stories about going into hell to get someone back. (In the western canon proper the wholly successful instance is Heracles saving Alcestis.) The second is the (more literary) stories of dealing with the dead to find out about yourself, or the future. This begins with the Nekuia in the Odyssey, in which Odysseus doesn&apos;t actually descend to the underworld, but only to its borders, to consult with Teiresias, but meets with a flock of shades of those he knew. In Virgil there is an actual descent (&lt;em&gt;Facilis descensus Averno: Noctes atque dies patet atri janua Ditis; Sed revocare gradum, superasque evadere ad auras, Hoc opus, hic labor est&lt;/em&gt;) for prophesy delivered by Anchises about the future, his own and his descendants. Dante&apos;s voyage through the three parts of the afterlife are patterned on Virgil: the end result of the threefold vision is the knowledge of self and of the order of the world.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;em&gt;Katabasis&lt;/em&gt; starts out by looking like the first, and ends up as the second, with a neat pivot which is not complete until the second last chapter. Between those two points it proceeds through an underworld which is rather like Dante&apos;s &lt;em&gt;Inferno&lt;/em&gt; and &lt;em&gt;Purgatorio&lt;/em&gt; laid in top of one another. There are other traditions of the afterlife as well - it&apos;s understood that the end of it is reincarnation, very un-Dantean but grounded in Virgil, although one does have to reflect that nothing seems to be really known about the equivalent to the Elysian Fields in this model. And there is a notable contribution of Eastern gods of the dead.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The skewering of the worst of academia is sometimes funny and sometimes more depressing. I recall graduate school, and have no interest in doing it again. It is particularly effective in its take on the City of Dis..&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Ultimately, building on Dante, this is primarily a journey of self-discovery and redemption (small r), and finally ends hopefully, with a reference to the last line of the Inferno: &amp;quot;&lt;em&gt;e quindi uscimmo a riveder le stelle&lt;/em&gt;&amp;quot;.&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=127193&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/127193.html</comments>
  <category>reviews</category>
  <category>sf/fantasy</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/126851.html</guid>
  <pubDate>Tue, 11 Nov 2025 19:55:18 GMT</pubDate>
  <title>Coders at Work (Peter Seibel)</title>
  <link>https://jsburbidge.dreamwidth.org/126851.html</link>
  <description>&amp;nbsp;This book is a collection of interviews with prominent (at least within the programming community) software developers.  Most of them are important figures in the development of languages and operating systems; one is Donald Knuth. All are people who have significant bodies of actual code to their names.&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;There&apos;s a bit of a selection bias - there are no C++ gurus and most of the interviewees are dubious about C++, and maybe more Lispers than there might be in a random sample[1] - but in general these are significant names with a wide range of types of background (IBM, minis, micros, a lot of PDP-11 people (largely a function of age)). Almost everyone did C at some point.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;I find a few things interesting.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;First, they clearly belong to an extended community of which I&apos;m a part, in attitudes and shared assumptions. Despite this, in over twenty years in the development world in the financial sector, I&apos;ve relatively rarely met anyone like them. (I can think of a few possible exceptions, but it&apos;s rare.) And I don&apos;t mean in skill - these people outdo me in skill - but in attitude and approach. They talk, over and over again, about the importance of a &amp;quot;spark&amp;quot;, of enthusiasm and a real focus on the enjoyment of problem-solving while coding. In all the ways that I&apos;m like them, they aren&apos;t very much like (most of} my colleagues.[2]&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;They almost all use Emacs. In thirty years of being a developer. I&apos;ve never met anyone else who was a committed Emacs user. Most have read Knuth to one degree or another, as well. (I read through the first three volumes, and have started making my way through the newer volumes in book 4.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Many of them started out without formal training. In many cases, this was because they started in high school. In others, it&apos;s because programming was a hobby to them while they studied other disciplines, and then became a practical benefit when they started looking for work. (There are a few trained CS graduates and academics, products of or teachers of standard academic courses, with Knuth at one end of the spectrum and somebody like Thomson at the other.) The non-formally-trained ones still think like software engineers and not simply hackers, with concerns around process, design, and structure. Most of them started work with computers before the development of the current credentialist model creating a conveyor belt between university and the workplace; I managed to come in just at the tail end of when it was possible to become a mainstream developer with no formal certification if you could demonstrate skill.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;For someone like me it&apos;s a bit like looking in a slightly distorting mirror and wondering what I might have been like if I&apos;d gone to Waterloo[3] and done maths and CS rather than English and classics (with some math) at Trent. Certainly I&apos;d have had a different spectrum of opportunities; most of my work has been maintaining and extending already-established systems.&lt;br /&gt;&lt;br /&gt;Overall, though, I found it one of the better books I have read at conveying what the experience of software development is like. (There&apos;s Moran&apos;s &lt;em&gt;The Big Boost&lt;/em&gt;, where he follows Trent the Uncatchable doing software development as part of a team, and a bit of Vinge&apos;s &lt;em&gt;A Deepness In The Sky&lt;/em&gt;.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;[1] The author is a Lisp developer.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;It&apos;s not surprising that people like Stroustrup weren&apos;t interviewed; his work has been in language design rather than extensive coding. The more notable omissions would include Linus Torvalds and Richard  Stallman. (Though there&apos;s discussion of Stallman, including by somebody who also worked on the original TECO Emacs.) C++ possibilities might have included Stephen Dewhurst, Herb Sutter, or Jim Coplien.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;[2] Nobody else has ever said, in the Friday scrum, that it means two days before they could get back to coding on their current issues, rather than &amp;quot;Happy Friday&amp;quot;.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;[3] I didn&apos;t apply to Waterloo, but I got an (informal) offer from them anyway, when I came seventh on the Descartes in Canada.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=126851&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/126851.html</comments>
  <category>programming</category>
  <category>reviews</category>
  <lj:security>public</lj:security>
  <lj:reply-count>10</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/126571.html</guid>
  <pubDate>Fri, 10 Oct 2025 02:22:03 GMT</pubDate>
  <title>A Reflection</title>
  <link>https://jsburbidge.dreamwidth.org/126571.html</link>
  <description>&lt;div&gt;After about 55 years or so, I finally used the wonders of the internet to hunt down a song which we had learned (well, we learned the chorus) in Grade 6 French.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;It&apos;s &apos;L&apos;homme de Cro-Magnon&amp;quot;, and it seems to date back to 1946. It is, in one sense, a perfectly reasonable, albeit silly, song from a period which also gave us &amp;quot;I want a hippopotamus for Christmas&amp;quot;.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;On the other hand, what the actual f*** was our teacher thinking? There are many, many, classic short poems in French. We could have had &amp;quot;Mignonne, allons voir si la rose&amp;quot;. We could have had &amp;quot;Recueillement&amp;quot;. We could have had &amp;quot;Le Pont Mirabeau&amp;quot;, or &amp;quot;Elsa au miroir&amp;quot;.  We could even have had something by Pr&amp;eacute;vert. Instead, we got this piece of catchy shlock. And this was in an &amp;quot;enriched&amp;quot; class, in a Major Work programme, full of bright students. (When he was about two years older than the bulk of my classmates, Montaigne had finished the pre-university curriculum of his day, which involved rather more foreign language study than we ever had.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Most of this was lost on us. One of us, now dead, went on to teach in French in Montreal. One served in the army, where some bilingualism was presumably of use. I learned real French when I was dropped into a Lyc&amp;eacute;e six years later. I can&apos;t think of any of the rest of us who have obviously used the French we learned, and unlike Montaigne and Milton and even Wellington, our foreign language education was not yoked to the task of communicating a different culture which could live with us in later years, but merely delivered contemporary and artificial texts.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=126571&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/126571.html</comments>
  <category>education</category>
  <lj:security>public</lj:security>
  <lj:reply-count>8</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/126385.html</guid>
  <pubDate>Sun, 27 Jul 2025 23:04:36 GMT</pubDate>
  <title>Tom Lehrer Has Died</title>
  <link>https://jsburbidge.dreamwidth.org/126385.html</link>
  <description>&amp;nbsp;Given that he gave up satire because, he said, life has caught up with satire when Kissinger won the Nobel Peace Prize, I had been wondering what he thought of the events of the current USA. We may never know now.&lt;br /&gt;&lt;br /&gt;(I grew up with both LPs and the earlier EP which my father has picked up at Yale, so I&apos;ve been listening to his work for over 60 years.)&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=126385&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/126385.html</comments>
  <category>obituaries</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/126098.html</guid>
  <pubDate>Sun, 13 Apr 2025 11:20:30 GMT</pubDate>
  <title>Active and Passive</title>
  <link>https://jsburbidge.dreamwidth.org/126098.html</link>
  <description>&amp;nbsp;In journalism, the use of the passive voice, usually discouraged elsewhere stylistically, seems to be endemic in headlines.&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The problem is that the impact of the headline becomes very different when the agent is omitted. The CBC has a headline: &amp;quot;Carney attacked for wanting &apos;free ride,&apos; &apos;hiding&apos; from public amid latest campaign break&amp;quot;. It would leave a different impression if it said &amp;quot;Leaders of the CPC and Bloc attack Carney for wanting &apos;free ride,&apos; &apos;hiding&apos; from public amid latest campaign break&amp;quot;, which is in fact what the article is about.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=126098&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/126098.html</comments>
  <category>prose style</category>
  <category>politics</category>
  <lj:security>public</lj:security>
  <lj:reply-count>7</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/125696.html</guid>
  <pubDate>Tue, 08 Apr 2025 23:04:47 GMT</pubDate>
  <title>Election</title>
  <link>https://jsburbidge.dreamwidth.org/125696.html</link>
  <description>This may be the most remarkable election since 1968. Certainly it is by the current numbers. (I vaguely remember the 1968 Liberal convention coverage. I certainly remember Trudeaumania.)&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Two weeks and a bit into a campaign, before the debates, feels like being early to call a result. But it may be worthwhile, cautiously, to point out certain things:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;1) That Liberal majority in the polls does not (much) result from a Red Tory Carney picking up votes from the left edge of the CPC (non-ML). It seems to be what happens when a majority of normally NDP voters decide that blocking Poili&amp;egrave;vre at all costs is preferable to the alternative. (The fact that Jagmeet Singh is not necessarily popular with true progressives doesn&apos;t hurt either.) This means that there&apos;s little chance of the Conservative &lt;em&gt;campaign&lt;/em&gt;&amp;nbsp;changing many minds: the CPC is generally holding its core voters but cratering nevertheless. (By the same token, the ability to get large rallies out of CPC supporters will benefit them nothing, other than perhaps revving up the canvassers they need (Jenni Byrne is supposed to be good at managing &amp;quot;the ground game&amp;quot;), as it doesn&apos;t expand their support. If anything, by being Trumpy in style, it might reduce their potential support.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;It helps the Liberals that when Carney can go all Prime Ministerial, i.e. when he has to &amp;quot;break from campaigning&amp;quot; to deal with Trump he sounds genuine, serious, and positive. Some commentators are throwing around words like &amp;quot;Churchillian&amp;quot;, though that may be going a bit far.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;2) The fact that Carney is visibly uncomfortable with campaigning may actually be to his advantage among people who are tired of &amp;quot;politicians&amp;quot; but just want decent government.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;3) The split between the Ontario (and Maritime: let us not forget Peter MacKay and his legacy) and Western wings emerging into the daylight is in no way good for the CPC. It sort of makes the election start to look like the latter parts of the fight between King Arthur and the Black Knight. (&amp;quot;Only a flesh wound&amp;quot;).&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;4) In theory, the Liberals could still slip up badly, especially in the debates. But given the underlying dynamics, it would take a really impressive disaster to make a lot of the people who have indicated they support the Liberals in this election to stay at home and risk a win by Poilievre.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The debates are likely to be a stark contrast: on one side, an experienced attack dog whose key election lines are all negative[1] and in the other a very much not-a-politician whose core messages all fall ino the two buckets of &amp;quot;positive&amp;quot; and &amp;quot;bracing&amp;quot;. I suspect that viewers will largely take away what they came with.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;[1]Aside from a lot of tax cuts. When faced with a crisis, what else can small-government conservatives do?&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;5) Finally, there&apos;s the loose cannon of Danielle Smith. She plays to her supporters; her local support is strengthened by being seen as anti-Ottawa and relatively pro-American. But in the key areas of Ontario and Quebec it just puts most people&apos;s backs up, including a fair number of PC voters. (There&apos;s a swathe of Doug Ford supporters who dislike Smith, rather like Carney, and don&apos;t mind the idea of a Liberal PM with extensive financial and business experience. They might not vote for Carney, but if they don&apos;t they are liable to stay home.) And Poilievre will not, possibly cannot, condemn her univocally and strongly. Her behaviour may not shift many votes, but it is certainly likely to confirm anti-CPC voters in their views.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;So one can be somewhat hopeful that at least, with the whole world going to rack and ruin, we may get our best shot to minimize the damage here at home.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=125696&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/125696.html</comments>
  <category>politics</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/125415.html</guid>
  <pubDate>Tue, 25 Mar 2025 11:45:50 GMT</pubDate>
  <title>The Advantages of a Decent Education</title>
  <link>https://jsburbidge.dreamwidth.org/125415.html</link>
  <description>Paul Krugman, today on Substack, talking about voters blaming governments for conditions (specifically inflation) out of any individual country&apos;s control: &amp;quot;The race is not to the swift, nor the battle to the strong, neither yet electoral victory to parties with good policies; but time and chance happeneth to them all.&amp;quot;&lt;br /&gt;&lt;br /&gt;Koheleth is always apposite in some way, especially in the Authorized Version, or maybe the Vulgate. (&lt;em&gt;Vanitas vanitatum et omnia vanitas.&lt;/em&gt;)&lt;br /&gt;&lt;br /&gt;This touches on my reactions to posts elsewhere about people who have never heard of the &lt;em&gt;Odyssey. &lt;/em&gt;Although there is actually no obvious reason, given today&apos;s education system, that one should have run across Homer at any time during elementary or high school, it enriches one&apos;s experience to have read the Nekuia, or the recognition of Odysseus by means of an old scar (a passage chosen for discussion in Auerbach&apos;s &lt;em&gt;Mimesis&lt;/em&gt;), or the destruction of the suitors, or indeed almost any other passage. (Plus it&apos;s a foundation for reading other texts.)&lt;br /&gt;&lt;br /&gt;(My daughter, who has three years of Latin and also has a Greek Myths component in her English curriculum but clearly only a glancing familiarity with Homer, called me up a few weeks ago asking about the &lt;em&gt;Odyssey&lt;/em&gt;. I told her to read it in a decent prose translation. She asked if she could borrow my copy, and I told her that it wouldn&apos;t do her much good, as it starts with ἄ&amp;nu;&amp;delta;&amp;rho;&amp;alpha; &amp;mu;&amp;omicron;&amp;iota; ἔ&amp;nu;&amp;nu;&amp;epsilon;&amp;pi;&amp;epsilon; &amp;mu;&amp;omicron;ῦ&amp;sigma;&amp;alpha;...)&lt;br /&gt;&lt;br type=&quot;_moz&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=125415&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/125415.html</comments>
  <category>education</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/125174.html</guid>
  <pubDate>Tue, 25 Feb 2025 02:00:48 GMT</pubDate>
  <title>French Language Liberal Leadership Debates</title>
  <link>https://jsburbidge.dreamwidth.org/125174.html</link>
  <description>Freeland is painful, Carney awkward, Gould sounded as though she could actually survive on the streets of a French city (she did her B.A. at McGill), and Baylis sounded as though he has (he better have, as he was born in Montreal, even if he is an Anglo), although he was not displaying full formal facility with formal eloquent standard French, being rather more colloquial. I think that we deserve an Anglophone leader who speaks French as well as Lucien Bouchard spoke English.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=125174&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/125174.html</comments>
  <category>politics</category>
  <category>language</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/124724.html</guid>
  <pubDate>Thu, 06 Feb 2025 01:46:46 GMT</pubDate>
  <title>Measures: Two More Reasons To Avoid American Products</title>
  <link>https://jsburbidge.dreamwidth.org/124724.html</link>
  <description>&lt;div&gt;1) A month or two ago, I was looking for an adequate container for flour.  If you buy 5 kg bags of flour and up (best value, but a little excessive unless you bake really quite a lot) your best bet is a plastic garbage pail, but below that level a container that will fit on a shelf is a reasonable hope.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Flour in Canada is sold in 2.5 kg bags.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The containers available, all made in the US, are for five pound bags of flour. Those of us old enough to remember the Imperial System will recall that one kilo is 2.2 pounds, so we get five and a half pounds.  The flour containers will not hold the amount of flour one buys.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;I was somewhat scathing to the person at the store. One can get containers, not meant for flour as such, which are larger still; but it is rather pointless to offer for sale containers not really fit for their advertised use.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;2) On the other hand, they can&apos;t get the old system right either. I have a number of older English cookbooks, mainly Penguins, which predate the adoption of metric.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;I find it nigh impossible to find proper liquid measures. Ignoring the fact that a proper pint is 20 ounces (and a quart 40 ounces) all I can find is inferior US products which mislabel them as 16 and 32 ounces, respectively.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=124724&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/124724.html</comments>
  <category>cooking</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/124624.html</guid>
  <pubDate>Sun, 02 Feb 2025 15:13:08 GMT</pubDate>
  <title>Ship Money</title>
  <link>https://jsburbidge.dreamwidth.org/124624.html</link>
  <description>&amp;nbsp;In the run-up to the Civil War, Charles I levied money via a mechanism involving taxation to support the building and outfitting of ships. It required no parliamentary consent, and was challenged in court; Charles won.&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The parliamentary party claimed that the levy violated a principle that the Crown required the consent of Parliament to levy taxes. If you read Coke, or the Whig writers who follow him, you will gather that this is correct, and that there were ancient liberties going back to very early days of which this was one. By this argument, the parliament of the Petition of Right and the Long Parliament were merely defending an ancient constitution which the Crown was assaulting.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;With better scholarship and more disinterested scholars, it&apos;s now fairly clear that Coke and the parliamentarians were wrong all along the way. It would be more accurate to say that Parliament had begun to take the bit between its teeth and extend its powers under Elizabeth (partly driven by economic, partly by religious changes) but that the Tudors in general had the personal prestige needed to keep these trends in check. With the accession of the Stuarts to the throne, these tensions became public, and the slide toward what would become the Civil War began.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The question of the legality of Charles&apos; levies is now a dead issue: for all of the pretences of continuity, England has had two revolutionary resets to the fundamental principles governing the relation of Crown and Parliament (1642-1660, 1688, finally settled for good in 1745) and appeals to anything before the Restoration are pure antiquarianism.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The founders of the United States were mainly Whigs - a very few figures with more traditionslist views were among them, but most such colonists were Tories/Loyalists in the Revolution. They took as gospel the principle that the legislature alone had the power to levy taxes, and wrote it into their constitutions.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;There has been some erosion of this over the centuries (both in the US and elsewhere) by the growth of &amp;quot;secondary legislation&amp;quot; (i.e. regulations) where the legislature provides a framework but the executive can set details by direct regulation. This the legislature can, for example, establish a tax but allow the executive to set the rates. The same applies to measures which have a secondary effect of bringing money into the fisc (e.g. fines) but which are not primarily motivated by that goal.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The ability of the executive to set tariffs in an emergency is one such exception. It allows action to protect a national interest from economic threat without going through a lengthy process of legislation.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The tariffs levied by Trump claim to be allowed by this exception. However, given both the facts on the ground - it&apos;s hard to argue that any such emergency exists - and Trump&apos;s own statements elsewhere, it&apos;s clear that Trump wants tariffs because they raise money[1]. That is, he is performing an end run around the principle that revenues are to be raised only by the legislature using the declared &amp;quot;emergency&amp;quot; as a fig leaf to cover the real reasons&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;[1]In his view, from foreign countries; more realistically, from domestic importers and consumers.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;This is actually, from an American perspective, a more serious issue than that of the economic dislocation caused by the tariffs. Like the attack on birthright citizenship, or the attempts to impound funding flows authorized by Congress, or the attempt to buy out federal workers en masse without authorization for the expenses or to remove Inspectors General with no notice or reasons being provided, this is an attempt to arrogate to the Executive Branch powers granted neither by the Constitution nor by explicit acts of Congress[2]. The US is now in the middle of a constitutional crisis of a scale not seen since the American Civil War.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;[2]The tariffs are levied under an Act of Congress, but the claim that an emergency may be declared arbitrarily and with no evidence to trigger the condition goes well beyond the legislation. I expect that when this is challenged in court the Administration will claim that the determination is not subject to review by the courts.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=124624&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/124624.html</comments>
  <category>politics</category>
  <lj:security>public</lj:security>
  <lj:reply-count>5</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/124411.html</guid>
  <pubDate>Sun, 02 Feb 2025 12:05:17 GMT</pubDate>
  <title>Trade Wars</title>
  <link>https://jsburbidge.dreamwidth.org/124411.html</link>
  <description>&amp;nbsp;I was in an LCBO yesterday afternoon and was browsing beers when I saw an employee busy stocking shelves with an American beer - possibly Michelob or Old Milwaukee. My first thought was &amp;quot;that&apos;s not going to last long&amp;quot; but then I realized that almost all the beer by the American big brewers sold in Ontario are brewed and bottled in Ontario. The US beers that would be affected by Ford pulling US products from LCBO shelves would mainly be craft brews, or craft adjacent. (Samuel Adams and Sierra Nevada are imported, but Budweiser and Coors are Ontario made. (Goose Island is from Quebec.)) Vice-versa, Molson is Molson-Coors these days, and the headquarters is in the US, so Molson beers are in the same category. (Labatt&apos;s is technically Belgian, as part of AB InBev.) (Their product is crap as well, but for now I&apos;m avoiding talking about quality.)&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Which raises a question. There are plenty of &amp;quot;American&amp;quot; products produced in Canada by wholly-owned subsidiaries. Sometimes this dates back to pre-NAFTA times and has merely continued and in some cases it involves simply being easier to manage fairly large volumes by regional production. (Heinz Ketchup took out advertisements a week or so ago to point out that their Canadian ketchup is made in Canada. So is Coca-Cola.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;If the aim of avoiding purchasing American in favour of Canadian products is based on immediate flows of money, the purchase of Coke or Heinz or, for that matter, Molson Canadian is sending much of the money to Canadian workers and Canadian suppliers to those companies[1], but there is still a flow of profits to the US parent. A real &amp;quot;buy Canadian&amp;quot; campaign aimed at pressuring American business interests means buying local, and typically from smaller producers. (And more expensive ones, typically: cheap cat food comes from American sources like Purina, and the Canadian brands like Acana/Orijen are among a higher-priced set of products.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;[1]Inputs are another matter. Craft beers, for example, are made with a wide variety of hops, some of which have a single source - so even though they are usually guaranteed to be fermented, bottled, and sold locally they usually have by definition an international aspect.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Sometimes you can&apos;t tell where something comes from. Many products made for Loblaws or other grocers&apos; in-store brands merely say &amp;quot;made for&amp;quot; and gives the grocer&apos;s name but not the place of manufacture, or who did the manufacturing. Blue Label Peanut Butter says&amp;quot;Processed in Canada&amp;quot; but that leaves open the possibility that the raw materials could come from anywhere. Their Water Crackers have no source - it just gives Loblaws&apos; address, not the manufacturer&apos;s.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;This is not specific to own brand labels: neither PC nor Classico sauces have a &amp;quot;Made in&amp;quot; statement. But it it a reasonable though not certain inference that a product from a Canadian manufacturer is likely to be sourced in Canada, but no such inference can be drawn from a brand of a retailer, which sells products from all over the world.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;If you want to buy Canadian, your best bet aside from really diligent research is to buy from smaller specialist stores, more likely to be locally owned; to buy not only &amp;quot;Canadian&amp;quot; but local (sometimes from non-local chains: Whole Foods has a policy of sourcing from and highlighting local products[2]); and to be ready to pay more than a baseline amount for the products in question, except for agricultural goods in season, where local will tend to be cheaper.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;[2]There&apos;s a small dilemma: Whole Foods is better along a whole set of axes (labour, ethical sourcing) than Loblaws or some of its other competitors[3], but it is emphatically US-based.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;[3]The local Whole Foods is close to a Longo&apos;s: this is a local chain which started as an Italian immigrant grocery store and grew. It is partly-owned by the founding family and partly by the chain which owns Sobeys; it&apos;s essentially a competitor in Loblaws&apos; space, i.e. neither discount nor luxury. There are a number of brand-name products carried by both Longo&apos;s and Whole Foods. It is my experience that these are almost always cheaper at Whole Foods. They have a reputation of being expensive because they don&apos;t carry cheap food, but their markups do nut seem to be exceptionally high.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The perspective changes if we shift to &amp;quot;boycott US&amp;quot; instead. Then we can look at goods from elsewhere - which is arguably what we should be doing: strengthening ties with non-US trading partners. For the next four years, we&apos;re all in this together.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;-----&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;On the political front, it&apos;s clear that Trump wants tariffs simply because he likes tariffs, and that his pointing to the (small, apparently) traffic in fentanyl across the border is a veil over his dislike of the US trade deficit with Canada.  The main check on Trump (other than the real but not certain possibility that his action will be found to be illegal - there are several reasons that this is arguably ultra vires) is that the markets, which had previously been treating the tariff threat as a negotiating tactic, will react badly enough that Trump pulls back. He does pay attention to the stock markets.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;On our side of the border, the current headlines talking of a &amp;quot;possible trade war&amp;quot; understate it: my estimate is that a leader who did not retaliate in what was perceived to be a strong manner would be severely punished in public opinion, at the metaphorical level of being strung up on a lamppost - and there are elections coming up. Neither Ford nor Trudeau can be seen as neglecting to hit back.&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=124411&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/124411.html</comments>
  <category>politics</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/123986.html</guid>
  <pubDate>Sat, 25 Jan 2025 01:06:48 GMT</pubDate>
  <title>Editions</title>
  <link>https://jsburbidge.dreamwidth.org/123986.html</link>
  <description>&amp;nbsp;(This is a bit of a ramble; there&apos;s no grand argument here, more like some free association,)&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;In 1980, I was introduced to &lt;em&gt;Piers Plowman&lt;/em&gt; in the form of the Clarendon Mediaeval and Tudor Series edition of the first part (i.e. that part corresponding to the A-Text) of the B-text. It was essentially a light reworking by J.A.W. Bennett of Skeat&apos;s edition of the late 19th Century, with notes added for students. This was in the context of a course focussed mainly on Chaucer, but I was interested enough in Langland to have written a paper on Piers, but I cannot recall what it said, except that it referenced the passage on the harrowing of hell.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;A year later, I was introduced to some of[1] the fighting over modern textual criticism when I took a course in codicology in graduate school under Lee Patterson, in the form of the arguments over the Kane/Donaldson edition of the B-text. (Patterson wrote an article on the issues around the edition, &amp;quot;The Logic of Textual Criticism and the Way of Genius: The Kane-Donaldson&lt;em&gt; Piers Plowman&lt;/em&gt; in Historical Perspective&amp;quot;, reprinted in Patterson&apos;s &lt;em&gt;Negotiating the Past&lt;/em&gt;, at about that time.) The editors (put very briefly) identified such a large degree of convergent variation in the editions of the A-Text and B-Text that classic stemmatics became impossible; editing had to be locus by locus. (There has not been universal agreement: Charlotte Brewer in particular was vocal in dismissing the approach. Given that her own analysis has led to the identification of an earlier Z-text which is even more dubious, I&apos;m inclined to agree with Kane.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;[1]The other big argument at that time was over the Gabler &lt;em&gt;Ulysses&lt;/em&gt;. That has never really settled down - there&apos;s a standard paperback aimed at the academic market using the Gabler text but there are also emphatic holdouts. The Folio edition of &lt;em&gt;Ulysses&lt;/em&gt; uses the older text.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;About a year after that I purchased a complete &lt;em&gt;Piers Plowman&lt;/em&gt;; the EETS edition of the Skeat B-text (second-hand, at Thornton&apos;s, in Oxford). This was my reading copy for a good number of years. The Bennett edition was better as far as it went, but dropped about two-thirds of the poem.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The critical edition by the Athlone Press - that is, the George Kane versions, completed in 1999 by a C-text version by Kane and Russell - seemed to have remarkably little effect on what was broadly read. The copies of PP I ran across from time to time in second-hand stores were all based on Skeat - either the EETS version, or the short version by Bennett - and that seemed to reflect what students were reading. The Knott/Fowler edition of the A-Text showed up once (to be grabbed immediately) but the A-Text is really a version for somebody who has already become interested in the poem and wants to see the other versions.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;(For some reason, the C-text shows up rarely to not at all second-hand. The student versions were of the B-text until Pearsall&apos;s student edition of the C-text in 1978 - but I&apos;ve never seen the Pearsall in the wild, so to speak, although it has been reissued twice, mist recently in 2008, so it&apos;s clearly in use.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;A couple of years ago I found the parallel-text edition by Skeat at the Trinity College Book Sale - a career academic had retired and I was able to also acquire the EETS Gower and a few other Middle English texts as well. This gave me a second copy of the Skeat B-text plus a parallel A-Text and C-text, completing a collection of all three texts after a little over 40 years.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Then, about three months ago, I ran across the Kane edition of the A-Text in a local second-hand bookshop at a decent price. Like all of the Athlone Press versions, it has a long introduction (all about textual editorial principles and the evidence of the MSS) and full textual apparatus. It also happens to be a good reading text[2] with clear type, good page design, and overall very pleasing aesthetics. A check on AbeBooks also indicated that I could get a copy of the Kane/Donaldson B-Text reasonably cheaply, so I ordered it; it arrived late last year on the first day the Post office was back in operation again. It has an even longer preface (which I had read over forty years before) and is an equally good reading copy.[3]. The only problem with the Athlone versions is that they&apos;re not necessarily what you want to take on transit; they&apos;re hefty hardcovers with about half their pages being given over to the prefaces.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;[2]If you know Middle English. There&apos;s an extensive apparatus, but it&apos;s all textual variants. The Bennett and Pearsall editions would be what to use if you need more glosses and/or context.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;[3]Some scholarly editions are run-of-the-mill books. Some show the signs of excellent design, and manage to fill both the demands of scholarly documentation and the reader&apos;s experience quite well. Another good example is the standard edition of Tristram Shandy, which is a lovely reading copy. (You can get the text of that edition as that in the newer Penguin Classics edition but, again, with a different kind of apparatus.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;All this raises the general question: in a case where there is a choice of editions of a text, which one should one choose, and why? (It&apos;s worse with Shakespeare. Just about every major edition of Hamlet differs from all the others; the degree of variance is less than with PP, but the number of choices is much greater.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;In some cases the key factor is simply expense and availability. To take a simple example of a popular novel: the definitive edition of Jane Austen remains that of R.W. Chapman, and the original books are lovely artifacts. It&apos;s one of the last scholarly books I know of printed using catchwords. (And you can get cloth bound volumes second hand for about 40 dollars sometimes.) It remains in print; a current new copy in paperback of one volume is about a hundred dollars. The original was also published in Morocco leather: the full set of five volumes runs about 5,500 (USD) second-hand. But the text itself, minus the apparatus and secondary material, is in the Oxford Illustrated Jane Austen, which is much cheaper (especially second hand). The Folio editions are about 80 USD per volume. If you just want to read the text, regardless of format, Project Gutenberg has free texts based on Victorian editions, and a Penguin Classics text is a cheap but reliable version (largely based on Chapman) and is available second-hand for about five dollars.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;All of which resolves itself to essentially five choices:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;1) Just want a reading copy, don&apos;t care about text, willing to read online: Gutenberg&lt;/div&gt;&lt;div&gt;2) Want a cheap copy to read in hardcopy: Penguin Classics or equivalent (10-20, depending on second hand or new).&lt;/div&gt;&lt;div&gt;3) Want a reliable copy with full editorial detail: from 40-90 dollars per volume, depending on Second Hand (HC) or new (Trade PB).&lt;/div&gt;&lt;div&gt;4) Want a very good hardcover reading copy: from 40 to about 100 (Second Hand Chapman/OUP to Folio).&lt;/div&gt;&lt;div&gt;5) Want the best version available on all counts: 1,100 per volume (Antiquarian leather-bound Chapman edition)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Most readers will fall into categories (1) and (2). (3) is pricey because there&apos;s a severe dropoff in demand numbers which affects the economics of publishing really scholarly editions in bulk. (4) is essentially a luxury market.  In this case it happens to overlap with the scholarly market, but this market exists for non-scholarly books also. (5) is an extreme form of the luxury market: if you had money to throw away you could treat these as nice reading copies but they fall more into the &amp;quot;collector&amp;quot; space. (They&apos;re what Folio pretends to be.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;There are few variants in the text itself, though: the only authoritative source is the first edition, with a couple of corrections which may or may not be made following Chapman.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;At the other extreme, consider Joyce&apos;s &lt;em&gt;Ulysses&lt;/em&gt;.  You can get reasonably cheap paperbacks of both the older text and the Gabler text, and there&apos;s an unresolved war over the superiority of one over the other. (Older texts, I should say, because there&apos;s more than one.)  I have a second-hand copy of the paperback of the Gabler text aimed at students and the general reader which cost about 20 dollars or less.  The old Bodley Head edition is a very nice reading copy, at 20 to 30 dollars second-hand.  At a slightly higher end I was able to pick up the 1999 Folio edition (which is very emphatic about not being the Gabler text) for about 50 dollars.  But all of those are simply the text itself.  For the apparatus, the three volume Gabler edition with full printing of variants is 750 for three volumes, second hand. That&apos;s not that unusual with large works for which the primary market is libraries: the Frankel&lt;em&gt; Agamemnon&lt;/em&gt; is 500 dollars, second hand (also three volumes). (By comparison, you can get the very respectable Denniston and Page edition for about 30 dollars.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;In the end, this little associative tour may be more about markets than editions.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The collector&apos;s market, the one with $5,500 Jane Austen sets or the edition of the Allen Oxford Classical Texts Homer in calf leather and onionskin[4] isn&apos;t really a market in an economist&apos;s sense of the word. There&apos;s no mechanism for setting an agreed-on value.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;[4]This was a real thing. I saw it once in a library copy, and it&apos;s a lovely piece of work, and belongs to a vanished world.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The market for the Folio Society isn&apos;t really a collector&apos;s market, although I&apos;m sure some people collect Folio editions the way some people collect Foulis Press editions, at a lower cost. It&apos;s a market for general readers with lots of money who see themselves as book fanciers. (They have shifted away from publishing editions of the classics to publishing the entire &lt;em&gt;Dune&lt;/em&gt;&amp;nbsp;series, Marvel comic collections, and Le Carr&amp;eacute;. I don&apos;t think their choices are poor from a marketing perspective, but it declares their market in a way that editions of Trollope, Austen, and Gibbon don&apos;t.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The academic market, like the professional market which I knew on the other side when I was a legal editor, is one characterized by high costs - accuracy and reasonable usability are important - and small audiences, usually libraries and a few dedicated professionals. From a publisher&apos;s point of view, unless you are publishing a book which might be put on undergraduate courses, your market is little larger than that which might have been before an eighteenth-century publisher: a set of libraries, plus a smaller number of individuals with the means and interest to purchase your product.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;By comparison, the general market is vast. If only one in a thousand people are interested in buying a paperback copy of &lt;em&gt;Clarissa&lt;/em&gt;[5], well, that makes forry thousand some potential customers in Canada, two hundred thousand in the United States, and maybe seventy thousand in the UK and Europe. Thus, modernizations of &lt;em&gt;Piers Plowman&lt;/em&gt;&amp;nbsp;are vastly cheaper than editions of the original text. This also has a bearing on why, although in general the theory of academic editions relies on copy-text for accidentals, editions of Shakespeare tend to have modernized language: it increases their market many-fold.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;[5]I&apos;m not. I read and enjoyed &lt;em&gt;Pamela&lt;/em&gt;, but my life is likely to run out before I finish all the books which are in a notional queue before &lt;em&gt;Clarissa&lt;/em&gt;.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Commercial authors in the serious midlist area can hope to do rather better[6]. Commercial bestsellers get to maybe one percent of the American public at best but the economies of scale are such that deep discounting still provides massive profits to the publisher and the author.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;[6]Better than Piers Plowman modernizations. Doing better than Pride and Prejudice is a different category of challenge.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=123986&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/123986.html</comments>
  <category>book trade</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/123797.html</guid>
  <pubDate>Sun, 17 Nov 2024 02:23:09 GMT</pubDate>
  <title>One thing Biden could do...</title>
  <link>https://jsburbidge.dreamwidth.org/123797.html</link>
  <description>&amp;nbsp;... which Trump couldn&apos;t reverse:&lt;br /&gt;&lt;br /&gt;Pardon everybody Trump has mentioned going after for personal or partisan reasons. (His relatives, Harris, Cheney, etc.).&lt;br /&gt;&lt;br /&gt;There&apos;s precedent for broad pardons for &amp;quot;anything done under the term of ...&amp;quot; (more monarchical than Presidential, but there&apos;s continuity there).&lt;br /&gt;&lt;br /&gt;Mist things a president can do by executive order can be reversed by another executive order. Pardons are not in that category.&lt;br type=&quot;_moz&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=123797&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/123797.html</comments>
  <category>politics</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/123506.html</guid>
  <pubDate>Thu, 14 Nov 2024 00:29:13 GMT</pubDate>
  <title>Anglo-Saxons</title>
  <link>https://jsburbidge.dreamwidth.org/123506.html</link>
  <description>&lt;em&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;Religion and Literature in Western England, 600-800 &lt;/span&gt;&lt;/em&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;by Patrick Sims-Williams&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;em&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;Building Anglo-Saxon England &lt;/span&gt;&lt;/em&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;by John Blair&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;&lt;br /&gt;&lt;em&gt;Menewood&lt;/em&gt; by Nicola Griffith&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;One of these books is, obviously, not like the others.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;The Sims-Williams book covers, in detail, what can be known about an area relatively close to what later would be the Welsh Marches (Hwicce and Magons&amp;aelig;te). Virtually everything known dates from a period after the initial establishment of the kingdoms: most documents were generated by the Church (and most documents are in Latin: as far,as I know, we have no surviving documents in the dialect of the area).&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;The Blair book is a magisterial study of the built form of Anglo-Saxon England. It covers many things but the takeaway for this discussion is that in general Anglo-Saxon material culture was such as to leave relatively few archaeological traces (wood, cloth, leather). Settlements may have left few archaeological traces. (The complex of dwellings associated with the East Anglian royal house is one of the things we have some evidence for - but even then it&apos;s basically the outlines of the foundations of the buildings.)&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;em&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;Menewood&lt;/span&gt;&lt;/em&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt; is a historical novel covering about two years in the life of Hilda (the Latinized form of her name) of Whitby, at about the age of twenty. Griffith hints at the end of the book what the next one will be about, with a view of the wider world.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;However, &amp;quot;historical&amp;quot; is a slippery term here.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;Once you get back to Hild&apos;s early days, a period of Christianisation, there is very little beyond the dates of battles and the deaths of kings, and none from contemporary documents. Bede has good coverage of what he is concerned with, but he is not a social historian, or even a general historian. (Bede would have known some people old enough to remember that period, much as I knew people, when I was young, who could remember Victoria&apos;s Jubilee. But he is a generation later.)&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;The battle at the climax of the book is an important event in Bede, where it is essentially a miracle validating King (later Saint) Oswald; it&apos;s essentially unrecognizable in the novel, in part because Griffith is being deliberately revisionist, but in part because the level of action the book covers is simply not recorded in anything remotely close to the period at all.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;Let me be blunt: other than a few names and the dates of a few battles, we know almost nothing about the matter in Menewood. We know nothing about relative degrees of Christianisation; we know nothing about what Anglian paganism actually looked like; we have no clear idea of what the range and flexibility of gender roles was. We&apos;re even guessing about what people wore. We know about the names of kings and important churchmen and the broad sweep of their lives, with the odd illumination of little vignettes like Caedmon&apos;s vision.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;Griffith&apos;s novel is technically plausible. There is nothing we know which prevents it from having happened. But it&apos;s wildly unlikely. It&apos;s unlikely on a level which makes Francis Crawford of Lymond look like a model of historical accuracy; at least everyone and everything he deals with is solidly grounded. (And nobody is making a pretence that Lymond is real; just almost everybody he deals with.)&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;It&apos;s a very good novel, but the term &amp;quot;historical fiction&amp;quot; is bring stretched to the breaking point. It&apos;s adjacent to (but never slips into) Alternate History as a branch of speculative fiction, as it preserves the space for the history we know to follow.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;Books set in blank areas don&apos;t have to be quite like that. Sutcliffe&apos;s &lt;em&gt;Sword At Sunset&lt;/em&gt; is about the even more poorly-attested Arthur, but it generally tries to keep to the way of the reasonably likely. (Stewart&apos;s Merlin books cross the boundary into spec fic by presenting Merlin&apos;s power as real.)&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;Griffith does know the background well. She&apos;s not slipshod or misleading about anything we can know. Her depiction of the (deeply problematic) ethos of the comitatus (about which we know a good deal, generally) is spot on, and her translation of Cadwallon&apos;s historical record into concrete terms is well thought-out. But the closer we get to Hild herself, the closer we get to a bubble of just-plausible improbability.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;It&apos;s well worth reading, but take the idea that it&apos;s a guide to history of any sort with several large pinches of salt.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=123506&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/123506.html</comments>
  <category>reviews</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/123236.html</guid>
  <pubDate>Sat, 21 Sep 2024 12:12:14 GMT</pubDate>
  <title>Chant d’automne</title>
  <link>https://jsburbidge.dreamwidth.org/123236.html</link>
  <description>I&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Bient&amp;ocirc;t nous plongerons dans les froides t&amp;eacute;n&amp;egrave;bres ; &lt;br /&gt;Adieu, vive clart&amp;eacute; de nos &amp;eacute;t&amp;eacute;s trop courts! &lt;br /&gt;J&amp;rsquo;entends d&amp;eacute;j&amp;agrave; tomber avec des chocs fun&amp;egrave;bres&lt;br /&gt;Le bois retentissant sur le pav&amp;eacute; des cours.&lt;br /&gt;&lt;br /&gt;Tout l&amp;rsquo;hiver va rentrer dans mon &amp;ecirc;tre: col&amp;egrave;re,&lt;br /&gt;Haine, frissons, horreur, labeur dur et forc&amp;eacute;,&lt;br /&gt;Et, comme le soleil dans son enfer polaire,&lt;br /&gt;Mon coeur ne sera plus qu&amp;rsquo;un bloc rouge et glac&amp;eacute;.&lt;br /&gt;&lt;br /&gt;J&amp;rsquo;&amp;eacute;coute en fr&amp;eacute;missant chaque b&amp;ucirc;che qui tombe;&lt;br /&gt;L&amp;rsquo;&amp;eacute;chafaud qu&amp;rsquo;on b&amp;acirc;tit n&amp;rsquo;a pas d&amp;rsquo;&amp;eacute;cho plus sourd.&lt;br /&gt;Mon esprit est pareil &amp;agrave; la tour qui succombe&lt;br /&gt;Sous les coups du b&amp;eacute;lier infatigable et lourd.&lt;br /&gt;&lt;br /&gt;Il me semble, berc&amp;eacute; par ce choc monotone,&lt;br /&gt;Qu&amp;rsquo;on cloue en grande h&amp;acirc;te un cercueil quelque part.&lt;br /&gt;Pour qui? &amp;ndash; C&amp;rsquo;&amp;eacute;tait hier l&amp;rsquo;&amp;eacute;t&amp;eacute;; voici l&amp;rsquo;automne!&lt;br /&gt;Ce bruit myst&amp;eacute;rieux sonne comme un d&amp;eacute;part.&lt;br /&gt;&lt;br /&gt;II&lt;br /&gt;&lt;br /&gt;J&amp;rsquo;aime de vos longs yeux la lumi&amp;egrave;re verd&amp;acirc;tre,&lt;br /&gt;Douce beaut&amp;eacute;, mais tout aujourd&amp;rsquo;hui m&amp;rsquo;est amer,&lt;br /&gt;Et rien, ni votre amour, ni le boudoir, ni l&amp;rsquo;&amp;acirc;tre,&lt;br /&gt;Ne me vaut le soleil rayonnant sur la mer.&lt;br /&gt;&lt;br /&gt;Et pourtant aimez-moi, tendre coeur! soyez m&amp;egrave;re,&lt;br /&gt;M&amp;ecirc;me pour un ingrat, m&amp;ecirc;me pour un m&amp;eacute;chant;&lt;br /&gt;Amante ou soeur, soyez la douceur &amp;eacute;ph&amp;eacute;m&amp;egrave;re&lt;br /&gt;D&amp;rsquo;un glorieux automne ou d&amp;rsquo;un soleil couchant.&lt;br /&gt;&lt;br /&gt;Courte t&amp;acirc;che! La tombe attend ; elle est avide!&lt;br /&gt;Ah! laissez-moi, mon front pos&amp;eacute; sur vos genoux,&lt;br /&gt;Go&amp;ucirc;ter, en regrettant l&amp;rsquo;&amp;eacute;t&amp;eacute; blanc et torride,&lt;br /&gt;De l&amp;rsquo;arri&amp;egrave;re-saison le rayon jaune et doux!&lt;br /&gt;&lt;br /&gt;Charles Baudelaire, &lt;em&gt;Les fleurs du mal&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=123236&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/123236.html</comments>
  <category>poetry</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/123038.html</guid>
  <pubDate>Wed, 11 Sep 2024 00:29:02 GMT</pubDate>
  <title>Still alive</title>
  <link>https://jsburbidge.dreamwidth.org/123038.html</link>
  <description>&lt;p&gt;I have been generally inactive here (save for some comments) for the past while, as most of my online writing has gone into &lt;a href=&quot;https://jsburbidge.blogspot.com/&quot;&gt;a much more technical blog&lt;/a&gt; of little general interest except to others involved in software development.

&lt;p&gt;I expect to be more active here in the near future; the set of projects I was working on (and writing about) is largely complete.&lt;/p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=123038&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/123038.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/122471.html</guid>
  <pubDate>Wed, 12 Jul 2023 18:13:46 GMT</pubDate>
  <title>Victoria Goddard and Her Works</title>
  <link>https://jsburbidge.dreamwidth.org/122471.html</link>
  <description>&amp;nbsp;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;A few months ago, I ran across a reference by Jo Walton in one of her Tor reading lists to a work by Victoria Goddard, whom I had never encountered before. A quick check around the net revealed a large number of very positive reviews of Goddard&apos;s work, so I decided to check her work out.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;(Note that as Goddard is self-published, her work is quite reasonable in price if bought as e-books but fairly pricey if bought as hardcopy. E-books are available directly from her website or via various other sites (though not from Google Books).)&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot;&gt;Goddard is good, and worth recommending, although she is not quite as good as many of her more enthusiastic reviewers would make her out to be.  The discussion below is (of necessity) rather full of spoilers.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;cut-wrapper&quot;&gt;&lt;span style=&quot;display: none;&quot; id=&quot;span-cuttag___1&quot; class=&quot;cuttag&quot;&gt;&lt;/span&gt;&lt;b class=&quot;cut-open&quot;&gt;(&amp;nbsp;&lt;/b&gt;&lt;b class=&quot;cut-text&quot;&gt;&lt;a href=&quot;https://jsburbidge.dreamwidth.org/122471.html#cutid1&quot;&gt;Spoilers below...&lt;/a&gt;&lt;/b&gt;&lt;b class=&quot;cut-close&quot;&gt;&amp;nbsp;)&lt;/b&gt;&lt;/span&gt;&lt;div style=&quot;display: none;&quot; id=&quot;div-cuttag___1&quot; aria-live=&quot;assertive&quot;&gt;&lt;/div&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space-collapse: preserve;&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=122471&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/122471.html</comments>
  <category>reviews</category>
  <category>reading</category>
  <category>sf/fantasy</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/122203.html</guid>
  <pubDate>Tue, 09 May 2023 01:25:55 GMT</pubDate>
  <title>Sentinels and the STL</title>
  <link>https://jsburbidge.dreamwidth.org/122203.html</link>
  <description>&amp;nbsp;There&apos;s an old trick in searching a C-style string that you actually own (i.e. you can&apos;t do this in an implementation of strchr(), which requires a const argument): you can use a sentinel to speed up searching.&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;If you have a 300-character long C-style string, and it&apos;s not in read-only memory and is safe to modify, and you want to find the first instance of a character in the string, you can use std::strchr(), but that requires that at every point in the search the function has to check for two conditions: first, is it the character that you are searching for, and, secondly, is it the null/end-of-string character. Or you can very temporarily assign the value of the character you are looking for to the location of that terminal null and use memchr() instead, changing it back when the call is over. If you get the address of the artificial sentinel, there were no instances in the string.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Note that in this context this is a pure, old-fashioned optimization, of the sort that you don&apos;t do unless it&apos;s genuinely useful, as it complicates the code and makes it more brittle. That being said, it&apos;s a very long-established trick which shouldn&apos;t be particularly confusing.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;However, there are other domains where using a sentinel can be a win from the design and maintenance as well as the efficiency perspective.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;I had a set of conditions, settable at run time by command-line options, which set filters on a set of records. These were implicitly anded together - if a record didn&apos;t match a criterion, it was out. (There was special handling to allow two or more conditions of certain types to be ored together.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Writing this as a hardcoded set of if/else choices would have been horrendous. So I implemented them as a family of function objects stored in a vector.  The conditions could be set up initially in a fairly straightforward manner. If you set the most common reasons for filtering out up front, you could optimize to reduce the number of comparisons.  The conditions could be set up in a simple std::any_of call.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;However, if there was filtering out, there was still some stuff to do; this wasn&apos;t a simple case where you have to do stuff only when an item was found. So it looked like&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;if (std::any_of(a.begin(), a end(), [&amp;amp;](const auto&amp;amp; arg) {... condition ...})&lt;/div&gt;&lt;div&gt;(&lt;/div&gt;&lt;div&gt;// Do some stuff&lt;/div&gt;&lt;div&gt;// Return X&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;else&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;// Do some other stuff&lt;/div&gt;&lt;div&gt;// Return Y&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;This is ugly. It&apos;s maintainability isn&apos;t awful, but it&apos;s not great, either. And every run has an extra branch after the end of the STL algorithm.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;(Branching can mess with pipelining and slow down performance. This is in addition to being, frequently, maintenance problem points. In many cases both clarity and efficiency argue in favour of replacing branching by polymorphism.)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;But I had created these function objects. I could do anything I wanted with their interfaces. (If I hadn&apos;t, I could have used a wrapper.) So I added an additional execAfterFind() function to the function object, and all of the real criteria for exclusion had a (common, inherited) implementation corresponding to the if part of the test. I then created a new type which *always* matched and placed it at the end of the vector of tests in every case. It, and it alone, had an implementation of the new function corresponding to the else branch.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Now the call looked roughly like this:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;auto foo = std::find_if(a.begin(), a end(), [&amp;amp;](const auto&amp;amp; arg) {... condition ...});&lt;/div&gt;&lt;div&gt;foo-&amp;gt;execAfterFind();&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;This is cleaner overall, not only at this site. What about performance?&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;For the case where the record ends up not being filtered out, there&apos;s probably no gain: unless a really good optimizing compiler optimizes the test away on the &amp;quot;always matches&amp;quot; object through a polymorphic call (unlikely) the new object just moves an if/else test around. There might be a small cache benefit because all the object tests with their functions were allocated one after another and we just *might* have improved some cache locality, but I wouldn&apos;t count on that, either.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;However, most records are expected to be filtered out. Consider a record that gets booted by the first, most likely, test. In the old implementation there were two successive branches, one for the test, one for the branch after the STL algorithm has run its course. Now there is only the one branch. So we probably gained overall; we&apos;re certainly not likely to have made anything worse. So we have an improvement in readability / maintainability and efficiency, both at once.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;If your concern were strictly time optimization, and you have the space, and a known, small enough, set of criteria, by the way, this is not the way to go about it. For that you give every condition its own return value as a different power of 2 and use std:: accumulate rather than anything with a test. After running std::accumulate you can use if/else if all you care about is matching at all; otherwise, use an array of 256 (or 128, or whatever best suits your use case; table sizes corresponding to larger sets are probably not ideal unless you really need the speed over the space[1]) function objects addressed from a known point and just invoke them with the returned value as the array index. I do not recommend using jump tables of this sort as an approach supporting more maintainability, though: they are tremendously fragile in the context of code changes. They can be extremely fast.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Even a simple array of two functions can be used if you are setting values as only 1:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;std::array&amp;lt;std::unique_ptr&amp;lt;IFoo&amp;gt;, 2&amp;gt; funcs;&lt;/div&gt;&lt;div&gt;//Set up array&lt;/div&gt;&lt;div&gt;...&lt;/div&gt;&lt;div&gt;int val = std::accumulate(... parameters including initial value of 0...);&lt;/div&gt;&lt;div&gt;funcs[val].execAfterFind();&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The drawback is that you always visit every test; any_of and find_if truncate your search. You&apos;d have to give very, very careful thought to whether this would actually be a benefit or a cost, and you probably want to do careful profiling over a range of cases. (In the case I had, the majority of records would be screened out quickly; this would not have been an appropriate solution. If most had been retained, that would be another question.) The other drawback is that the table setup is rather more complex and uglier than the preparation for the sentinel approach.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;[1] If you have more than 8 tests then the gains from not branching are going to be counterbalanced by the need to process all eight tests rather than short-circuiting as find_if does.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=122203&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/122203.html</comments>
  <category>programming</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/121676.html</guid>
  <pubDate>Sun, 25 Dec 2022 16:18:27 GMT</pubDate>
  <title>Christmas (II)</title>
  <link>https://jsburbidge.dreamwidth.org/121676.html</link>
  <description>&amp;nbsp;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;The shepherds sing; and shall I silent be?&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;My God, no hymn for thee?&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;My soul&amp;rsquo;s a shepherd too; a flock it feeds&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;Of thoughts, and words, and deeds.&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;The pasture is thy word: the streams, thy grace&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;Enriching all the place.&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;Shepherd and flock shall sing, and all my powers&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;Out-sing the day-light houres.&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;Then we will chide the sunne for letting night&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;Take up his place and right:&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;We sing one common Lord; wherefore he should&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;Himself the candle hold.&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;I will go searching, till I finde a sunne&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;Shall stay, till we have done;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;A willing shiner, that shall shine as gladly,&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;As frost-nipt sunnes look sadly.&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;Then we will sing, shine all our own day,&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;And one another pay:&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;His beams shall cheer my breast, and both so twine,&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot; /&gt;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 14.85px;&quot;&gt;Till ev&amp;rsquo;n his beams sing, and my musick shine.&lt;br /&gt;&lt;br /&gt;-- George Herbert&lt;br type=&quot;_moz&quot; /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=121676&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/121676.html</comments>
  <category>christmas</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://jsburbidge.dreamwidth.org/121347.html</guid>
  <pubDate>Wed, 21 Dec 2022 14:56:54 GMT</pubDate>
  <title>Filtering</title>
  <link>https://jsburbidge.dreamwidth.org/121347.html</link>
  <description>&amp;nbsp;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;If you (for C++ developers values of you) happen to be in the happy possession of a C++20 compiler, one facility it provides is the range-based filter view which allows for iterating over a range while filtering out certain elements.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;If you don&apos;t have one, there are several options.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;At a simple level, for use with for_ each(), there&apos;s simple composition. If you have a filter predicate Pred for Foo:&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;class Pred&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;{&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;public:&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    bool operator()(const Foo&amp;amp; inVal) const;&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;};&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;And a functor that does something with them, Op:&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;class Op&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;{&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;public:&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    void operator()(const Foo&amp;amp; inVal);&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;};&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;you can always create a composite:&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;class FilteredOp&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;{&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;public:&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    FilteredOp(Op&amp;amp; inOp, const Pred&amp;amp; inPred);&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    void operator()(const Foo&amp;amp; inVal)&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;   {&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;        if (m_op(inVal))&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;            m_pred(inVal);&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    }&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;private:&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    Op&amp;amp; m_op;&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;   const Pred&amp;amp; m_pred;&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;};&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;(We will refer to this as the naive version. This could easily be turned into a template to do more general composition.)&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;This works just fine - if all you want to invoke is for_each(). But if you want to use, e.g. transform() or rotate_copy(), it won&apos;t work. (Some operations provide a filtered option with their _if variants. Many do not. Many of those operate in such a way that a valid return value is expected for every application. In other cases, e.g. sample(), there is no predicate functor to be extended in this way.)&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;It is also very slightly more elaborate to write&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Op op;&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;FilteredOp fop(op, Pred());&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;std::for_each(seq.begin(), seq.end(), fop);&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;than, say,&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Op op;&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;filtered_for_each(seq.begin(), seq.end(), op, Pred());&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;even if you legitimately want to use for_each(), but only very slightly.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;(The same applies &lt;em&gt;a fortiori&lt;/em&gt; if FilteredOp is a closure; the difference lies in how closely you have to look at what is happening to discern intent; a closure has no name to assist the maintainer.)&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;The next alternative, if you have C++11, is to create a temporary filtered copy using copy_if:&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;typedef Seq std::vector&amp;lt;Foo&amp;gt;;&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Op op;&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;{&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    Seq tempSeq;&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    std::copy_if(seq.begin(), seq end(),    std::back_inserter(tempSeq), Pred());&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    std::for_each(tempSeq.begin(), tempSeq.end(), op);&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;}&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;This is not a great improvement on the naive version, and costs more. It does avoid multiplying entities. The big downside is that if you are processing the filtered data once, the copying costs in both time and memory.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;It has the advantage of bring idiomatic. And, of course, it works for a use of std::sample().  &lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;It is a better choice if you want to process the filtered data in any way more than once - by far the best choice, as the costs of subsequent iterations will be cut by the initial filtering, unless you have memory constraints. (Also note that in C++20, you can separate the filtered and unfiltered elements by using remove_copy_if and have two sequences ready for subsequent operations.)&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;One other advantage of the copy_if approach is that you can change the nature of the collection - you can, for example, iterate over a vector and insert into a set, effectively carrying out a sort on your filtered items at the same time. This may not be as efficient as copying to a vector and then applying a sorting algorithm - but again, a second stage in processing of this type is the sort of thing the copy_if approach enables.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;The other alternative is to turn to boost. Boost has a filter iterator, which skips elements satisfying Pred without doing any modifications. Thus:&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Op op;&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;std::for_each(boost::filter_iterator&amp;lt;Pred, Seq::iterator&amp;gt;(tempSeq.begin()), boost::filter_iterator&amp;lt;Pred, Seq:: iterator&amp;gt; (tempSeq.end()), op);&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;This works generally.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;If you need to filter once only, then this is preferable. (It can also be used to emulate copy_if if you have a C++03 compiler but also have boost, by using it with std::copy.) If you need to operate on the filtered set more than once, it is suboptimal, since every iteration has to visit every element in the full sequence each time - unless you are optimizing memory (large sequences) and care less about time; this is the option using the least memory.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;You can compose filters if you need to.  This gets confusing unless you use typedefs.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Whether it&apos;s idiomatic or not depends on how much you consider boost fundamental. The naming does declare exactly what you are doing, though.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;The original use case that got me thinking about this was one with a switch driven by context. If a flag was set, we iterate over everything; if not, we iterate over just the subset. In a for_each example, the naive implementation looks like:&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Op op;&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;If (flag)&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;{&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    FilteredOp fop(op, Pred());&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    std::for_each(seq.begin(), seq.end(), fop);&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;}&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;else&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    std::for_each(seq.begin(), seq.end(), op);&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;The copy_if example looks like:&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Op op;&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;If (flag)&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;{&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    Seq tempSeq;&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    std::copy_if(seq.begin(), seq end(),  std::back_inserter(tempSeq), Pred());&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    std::for_each(tempSeq.begin(), tempSeq.end(), op);&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;}&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;else&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    std::for_each(seq.begin(), seq.end(), op);&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;This can be simplified by filtering in a function&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;class Filter &lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;{&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;public:&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;const Seq&amp;amp; getFilteredRange(const Seq&amp;amp; inSeq, book inFlag)&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;{&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    if (inFlag)&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    {&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;        std::copy_if(inSeq.begin(), inSeq end(),  std::back_inserter(m_temp), Pred());&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;        return m_temp;&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    }&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    return inSeq;&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;}&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;private:&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    Seq m_temp;&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;};&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Filter f;&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Op op;&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;const Seq&amp;amp; toProcess = f.getFilteredRange(seq, flag);&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt; std::for_each(toProcess.begin(), toProcess.end(), op);&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Effectively the generator replaces the FilteredOp class, so it&apos;s a tradeoff in complexity but clearer at the call site.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;The functor can avoid using if/else if implemented as a strategy. This is useful if it will be used multiple times, always with the same value of flag (e.g. passed at the command line).&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;The boost example looks like:&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Op op;&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;If (flag)&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    std::for_each(boost::filter_iterator&amp;lt;Pred, Seq::iterator&amp;gt;(tempSeq.begin()), boost::filter_iterator&amp;lt;Pred, Seq:: iterator&amp;gt; (tempSeq.end()), op);&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;else&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    std::for_each(tempSeq.begin(), tempSeq.end(), op);&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;What about that notional filtered_for_each I threw in at the beginning?&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Well, it can just be implemented by wrapping the boost version in a template function call. I&apos;m not sure that the syntactic cleanup is better than a typedef, though. Once you have&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;typedef boost::filter_iterator&amp;lt;Pred, Seq::iterator&amp;gt; PredFilteredIterator;&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;instead of&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;template&amp;lt;typename T, typename U, typename V&amp;gt; void filtered_for_each(V&amp;amp; begin, V&amp;amp; end,  T&amp;amp; inOp, const U&amp;amp; inPred)&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;{&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;     &lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    std::for_each(boost::filter_iterator&amp;lt;U, V&amp;gt;(begin),&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;    boost::filter_iterator&amp;lt;U, V&amp;gt;(end), inOp);&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;}&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;(declaration more complex than that, and needing more policies, but you get the picture...)&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;then&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;filtered_for_each(seq.begin(), seq.end(), op, Pred());&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;versus&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;std::for_each(PredFilteredIterator(tempSeq.begin()), PredFileredIterator(tempSeq.end()), op);&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;isn&apos;t a big improvement in clarity, and involves a lot more finicky work getting the function definition both correct and general.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;It&apos;s generally a good idea to avoid for_each() as less expressive (and often less efficient) than the more specific algorithms in the STL. And anything that is complex enough that it doesn&apos;t fit any more specific algorithms is frequently complex enough that adding the filtering logic internally on a custom basis may make sense. (An example would be something aimed at generating elements in a collection based on another collection, but with a variable number based on the characteristics of the input parameter. This will not work with std::transform or std::generate_n. If you already have selection logic, integrating filtering logic may very well be more efficient on a custom basis inside your functor than doing so via any form, direct or indirect, of composition. Likewise, if you are processing a set of inputs and converting them into database insertions but skipping some, the field access you are doing to build the database insertions can double for filtering.)&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;In general, too, using a more precisely targetted algorithm instead of for_each() tends to move complexity out of the functor you have to write. In some cases it can move a lot complexity into library code. (Using remove_if() plus erase() is much, much simpler than implementing the behaviour in a general for loop of any sort.) But even using std::transform plus an inserter to fill a container means that you have separated out the code dealing with the target container from the code doing the element generation, even though the container logic remains in the application space.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;For all these reasons putting effort into writing an extended for_each is probably always using energy and attention which can be better expended elsewhere.&lt;/span&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;br style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot; /&gt;&lt;span style=&quot;color: rgb(32, 33, 36); font-family: Roboto, Arial, sans-serif; font-size: 16px; font-variant-ligatures: none; letter-spacing: 0.1px; white-space: pre-wrap;&quot;&gt;Matt Wilson&apos;s &lt;em&gt;Extended STL&lt;/em&gt; has a chapter on the implementation of filtering iterators. It may be worth emphasizing one thing that he notes; a filtered iterator cannot have the semantics of a random access iterator: not only will indexing be an issue, but so will the concept of distance between two iterators; both can in theory be supported but only a considerable expense, and may give unexpected values. (If we apply a filter F to a sequence of length 10, the effective length of the filtered sequence can&apos;t be determined without traversing the entire sequence, and an indexing operator might not even be anything but the end of the sequence (at one extreme) depending on how many elements were filtered out).  If you need random access semantics, using copy_if to generate a standard sequence is by far a preferable option.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=jsburbidge&amp;ditemid=121347&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://jsburbidge.dreamwidth.org/121347.html</comments>
  <category>programming</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
</channel>
</rss>
