<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Cora Sutton</title>
    <description>The latest articles on Forem by Cora Sutton (@corasaurus_hex).</description>
    <link>https://forem.com/corasaurus_hex</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F659968%2F092060f7-0d50-4c7d-bf8a-2f526780f395.jpg</url>
      <title>Forem: Cora Sutton</title>
      <link>https://forem.com/corasaurus_hex</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/corasaurus_hex"/>
    <language>en</language>
    <item>
      <title>Incognito for Shell Commands</title>
      <dc:creator>Cora Sutton</dc:creator>
      <pubDate>Fri, 06 Jan 2023 00:02:26 +0000</pubDate>
      <link>https://forem.com/corasaurus_hex/incognito-for-shell-commands-3olb</link>
      <guid>https://forem.com/corasaurus_hex/incognito-for-shell-commands-3olb</guid>
      <description>&lt;p&gt;We're usually careful not to store secrets in places easily accessible to others. We even do &lt;code&gt;chmod 600&lt;/code&gt; on our keys in &lt;code&gt;~/.ssh&lt;/code&gt; to prevent other users from reading it. There's one place, however, that we often forget to be careful about: our shell history files. Luckily, there are ways to prevent our commands that set or use secrets from entering our shell history. The following are instructions for how to go "incognito" for individual commands and prevent them from being logged in our shell history files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zsh
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;zsh&lt;/code&gt; has an option that's perfect for this: &lt;code&gt;HIST_IGNORE_SPACE&lt;/code&gt;. It even keeps the command around in-memory so you can execute it again if you need to while never writing it to disk.&lt;/p&gt;

&lt;p&gt;The manpage has this to say about the option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HIST_IGNORE_SPACE (-g)

  Remove command lines from the history list when the first character
  on the line is a space, or when one of the expanded aliases
  contains a leading space.  Only normal aliases (not global or
  suffix aliases) have this behaviour.  Note that the command lingers
  in the internal history until the next command is entered before it
  vanishes, allowing you to briefly reuse or edit the line.  If you
  want to make it vanish right away without entering another command,
  type a space and press return.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To begin using this you can call &lt;code&gt;setopt HIST_IGNORE_SPACE&lt;/code&gt; in your shell. To have this enabled by default for your shell you can add it to &lt;code&gt;~/.zshrc&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can see this option and more using &lt;code&gt;man zshoptions&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bash
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;bash&lt;/code&gt; also has an option for this: &lt;code&gt;HISTCONTROL&lt;/code&gt;. Here's the manpage entry for that option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HISTCONTROL

  A colon-separated list of values controlling how commands are saved
  on the history list.  If the list of values includes ignorespace,
  lines which begin with a space character are not saved in the
  history list.  A value of ignoredups causes lines matching the
  previous history entry to not be saved.  A value of ignoreboth is
  shorthand for ignorespace and ignoredups.  A value of erasedups
  causes all previous lines matching the current line to be removed
  from the history list before that line is saved.  Any value not in
  the above list is ignored.  If HISTCONTROL is unset, or does not
  include a valid value, all lines read by the shell parser are saved
  on the history list, subject to the value of HISTIGNORE.  The
  second and subsequent lines of a multi-line compound command are
  not tested, and are added to the history regardless of the value of
  HISTCONTROL.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should check what the current value for &lt;code&gt;HISTCONTROL&lt;/code&gt; is using &lt;code&gt;echo $HISTCONTROL&lt;/code&gt;. You can keep the current value or modify it to your liking and add it to your &lt;code&gt;~/.bash_profile&lt;/code&gt; using &lt;code&gt;export HISTCONTROL=ignorespace&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Note that there are other possible values for this and you should read the manpage entry above (or &lt;code&gt;man bash&lt;/code&gt;) for more details.&lt;/p&gt;

</description>
      <category>programming</category>
    </item>
    <item>
      <title>New Clojure Morsels!</title>
      <dc:creator>Cora Sutton</dc:creator>
      <pubDate>Wed, 15 Sep 2021 01:23:24 +0000</pubDate>
      <link>https://forem.com/corasaurus_hex/new-clojure-morsels-1ekc</link>
      <guid>https://forem.com/corasaurus_hex/new-clojure-morsels-1ekc</guid>
      <description>&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media ltag__twitter-tweet__media__video-wrapper"&gt;
        &lt;div class="ltag__twitter-tweet__media--video-preview"&gt;
          &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PqgFt7ie--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/tweet_video_thumb/E_Sejm8XEAAP3Eu.jpg" alt="unknown tweet media content"&gt;
          &lt;img src="/assets/play-butt.svg" class="ltag__twitter-tweet__play-butt" alt="Play butt"&gt;
        &lt;/div&gt;
        &lt;div class="ltag__twitter-tweet__video"&gt;
          
            
          
        &lt;/div&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--SJEEarSK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1404842910454063106/IuAO6Rn9_normal.jpg" alt="Clojure Morsels profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Clojure Morsels
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @clojuremorsels
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Hi, babes! It’s that time again! A new edition, hot off the presses and (hopefully) in your inbox. There is a *lot* going on in the Clojure world lately and it feels great to help you keep up with it, if only a little bit. (💜) -&lt;a href="https://twitter.com/corasaurus_hex"&gt;@corasaurus_hex&lt;/a&gt; &lt;br&gt;&lt;br&gt;&lt;a href="https://t.co/zKxDXdTdxG"&gt;mailchi.mp/clojuremorsels…&lt;/a&gt; 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      01:16 AM - 15 Sep 2021
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1437948520883961859" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1437948520883961859" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1437948520883961859" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


</description>
      <category>clojure</category>
      <category>news</category>
    </item>
    <item>
      <title>The Good, the Bad, and the Accumulators.</title>
      <dc:creator>Cora Sutton</dc:creator>
      <pubDate>Wed, 21 Jul 2021 23:11:29 +0000</pubDate>
      <link>https://forem.com/corasaurus_hex/the-good-the-bad-and-the-accumulators-1pa7</link>
      <guid>https://forem.com/corasaurus_hex/the-good-the-bad-and-the-accumulators-1pa7</guid>
      <description>&lt;p&gt;In programming it's common to need to accumulate a value. How you go about that in Clojure is a bit different from many other languages. In this post we'll go over some good ways and some not-so-good ways to accumulate values in Clojure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Not-so-good
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Def in a function
&lt;/h3&gt;

&lt;p&gt;If you're used to assigning to a value and then incrementing it, you might try something like this. Using def in a function like this, however, actually sets the value globally. If you have two threads calling this function at the same time you're going to get some wonky behavior.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my-fn1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my-variable1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;doseq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my-variable1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my-variable1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;my-fn1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"oops, my-variable1 is"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my-variable1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;;; oops, my-variable is 46&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using an atom
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://clojure.org/reference/atoms"&gt;Atoms&lt;/a&gt; are great! So are &lt;a href="https://clojure.org/reference/refs"&gt;refs&lt;/a&gt;! They're really for safely changing data from multiple threads safely, though. There's an expense to using them that you just don't want to pay unless you're using multiple threads and so it's best to avoid them in cases like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my-fn2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;my-variable2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;atom&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;doseq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;swap!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my-variable2&lt;/span&gt;&lt;span class="w"&gt;
             &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;current-value&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
               &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;current-value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"hi, my-variable2 is"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;my-variable2&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;my-fn2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;;; hi, my-variable2 is 46&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Volatile!
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://clojuredocs.org/clojure.core/volatile!"&gt;Volatile&lt;/a&gt; does work in this case but while volatile is faster than atoms it also has performance implications.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my-fn3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;my-variable3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;volatile!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;doseq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;vswap!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my-variable3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;current-value&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;current-value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"hello, my-variable3 is"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;my-variable3&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;my-fn3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;;; hello, my-variable3 is 46&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Good
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Reduce v1!
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://clojuredocs.org/clojure.core/reduce"&gt;Reduce&lt;/a&gt;! Now we're getting Clojure-y! This is a typical way to accumulate values in Clojure. You can do this with hashmaps, maps, sums, sets, etc, really anything at all. Reduce will go through each value in the range and pass in the previous accumulator value (or the starting value) and the current value in the range. The value returned from the function passed to reduce will be the new value for the accumulator. Once it runs out of values in the range the current value of the accumulator will be returned.&lt;/p&gt;

&lt;p&gt;Also, you can skip sending a starting value and then the first accumulator value is the first value in the range!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my-fn4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;starting-value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;my-variable4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;reduce&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;accumulator&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
                               &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;accumulator&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
                             &lt;/span&gt;&lt;span class="n"&gt;starting-value&lt;/span&gt;&lt;span class="w"&gt;
                             &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"omg, my-variable4 is"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my-variable4&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;my-fn4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;;; omg, my-variable4 is 46&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this case we can just pass &lt;code&gt;+&lt;/code&gt; as the function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my-fn5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;starting-value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;my-variable5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;reduce&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;+&lt;/span&gt;&lt;span class="w"&gt;
                             &lt;/span&gt;&lt;span class="n"&gt;starting-value&lt;/span&gt;&lt;span class="w"&gt;
                             &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"yay, my-variable5 is"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my-variable5&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;my-fn5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;;; yay, my-variable5 is 46&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Loop/recur
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://clojuredocs.org/clojure.core/loop"&gt;Loop&lt;/a&gt;/&lt;a href="https://clojuredocs.org/clojure.core/recur"&gt;recur&lt;/a&gt; is another essential way to handle this problem in Clojure. While I might not use it for adding up numbers I will use it for all kinds of other accumulations or complex behavior when looping over a sequence of values.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my-fn6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;loop&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;my-variable6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;first&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;recur&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my-variable6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
               &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;rest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"so, ok, my-variable6 is"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;my-variable6&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;my-fn6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;;; so, ok, my-variable6 is 46&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Conclusion
&lt;/h2&gt;

&lt;p&gt;It takes a little getting used to but eventually it feels a little uncontrolled and bug-prone to accumulate values the way some other languages do it.&lt;/p&gt;

</description>
      <category>clojure</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Read environment variables in Clojure</title>
      <dc:creator>Cora Sutton</dc:creator>
      <pubDate>Thu, 15 Jul 2021 20:13:50 +0000</pubDate>
      <link>https://forem.com/corasaurus_hex/read-environment-variables-in-clojure-e6i</link>
      <guid>https://forem.com/corasaurus_hex/read-environment-variables-in-clojure-e6i</guid>
      <description>&lt;p&gt;Do you want to load some &lt;a href="https://12factor.net/config"&gt;configuration&lt;/a&gt; &lt;a href="https://docs.github.com/en/actions/reference/environment-variables"&gt;values&lt;/a&gt; &lt;a href="https://docs.docker.com/compose/environment-variables/"&gt;from&lt;/a&gt; &lt;a href="https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/"&gt;the&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/Environment_variable"&gt;environment&lt;/a&gt; in &lt;a href="https://clojure.org/"&gt;Clojure&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;Great news! Clojure makes this easy!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;System/getenv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"SHELL"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c1"&gt;;=&amp;gt; /usr/local/bin/zsh&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are &lt;a href="https://github.com/juxt/aero"&gt;many&lt;/a&gt; &lt;a href="https://github.com/tolitius/cprop/"&gt;other&lt;/a&gt; &lt;a href="https://github.com/dunaj-project/crispin"&gt;ways&lt;/a&gt; &lt;a href="https://github.com/weavejester/environ"&gt;to&lt;/a&gt; &lt;a href="https://github.com/jarohen/nomad"&gt;configure&lt;/a&gt; &lt;a href="https://github.com/grammarly/omniconf"&gt;your&lt;/a&gt; &lt;a href="https://github.com/exoscale/yummy"&gt;Clojure&lt;/a&gt; &lt;a href="https://github.com/Otann/wrench"&gt;application&lt;/a&gt;, and some of us have our &lt;strong&gt;&lt;a href="https://github.com/outpace/config"&gt;favorites&lt;/a&gt;&lt;/strong&gt;, but environment variables often factor in.&lt;/p&gt;

&lt;p&gt;Give it a shot and see what you can learn!&lt;/p&gt;

</description>
      <category>clojure</category>
      <category>beginners</category>
    </item>
    <item>
      <title>New Clojure Morsels!</title>
      <dc:creator>Cora Sutton</dc:creator>
      <pubDate>Thu, 15 Jul 2021 18:22:23 +0000</pubDate>
      <link>https://forem.com/corasaurus_hex/new-clojure-morsels-48a4</link>
      <guid>https://forem.com/corasaurus_hex/new-clojure-morsels-48a4</guid>
      <description>&lt;p&gt;I just pushed our &lt;a href="https://mailchi.mp/clojuremorsels/2021-07-15-4clojure-4ever-fresh-new-clojure-morsels"&gt;first widely distributed edition&lt;/a&gt; of &lt;a href="https://www.clojuremorsels.com/"&gt;Clojure Morsels&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OFDgGHCE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9n2uohieyjmhb3vqswum.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OFDgGHCE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9n2uohieyjmhb3vqswum.png" alt="New edition of Clojure Morsels"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm &lt;strong&gt;really&lt;/strong&gt; proud of this one (&lt;em&gt;especially the cupcake&lt;/em&gt;), so check it out!&lt;/p&gt;

</description>
      <category>clojure</category>
      <category>news</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Announcing Clojure Morsels</title>
      <dc:creator>Cora Sutton</dc:creator>
      <pubDate>Thu, 01 Jul 2021 18:49:37 +0000</pubDate>
      <link>https://forem.com/corasaurus_hex/announcing-clojure-morsels-56ma</link>
      <guid>https://forem.com/corasaurus_hex/announcing-clojure-morsels-56ma</guid>
      <description>&lt;p&gt;I’m happy to announce that we have started a totally free newsletter called &lt;a href="https://www.clojuremorsels.com" rel="noopener noreferrer"&gt;Clojure Morsels&lt;/a&gt;! In it you’ll find links and summaries about all kinds of Clojure-related topics, from articles to tools to tutorials to jobs. You can find out more about it on our &lt;a href="https://twitter.com/ClojureMorsels/status/1410280203297902600" rel="noopener noreferrer"&gt;Twitter account&lt;/a&gt;. Let us know if you enjoy it and/or have feedback!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ru5of16h6zzafy2xluq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ru5of16h6zzafy2xluq.png" alt="A screenshot of a segment of the newsletter showing a few links and their summaries"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can find me as &lt;a class="mentioned-user" href="https://dev.to/cora"&gt;@cora&lt;/a&gt; on &lt;a href="http://clojurians.net/" rel="noopener noreferrer"&gt;Clojurians Slack&lt;/a&gt; if you want to chat.&lt;/p&gt;

</description>
      <category>clojure</category>
      <category>news</category>
    </item>
  </channel>
</rss>
