Scheme - difference between if and or












1















does somebody know what the difference between if and or in Scheme is or why I can't use if to replace or as an identifier? I posted some code below.
Thank's!



;if definition
(define heiner-or
(lambda (test-1 test-2)
(if test-1
#t
test-2)))

;or definition
> (heiner-or (= 10 10) (> 2 5))
#t
> (heiner-or (> 23 42) (< 5 2))
#f









share|improve this question





























    1















    does somebody know what the difference between if and or in Scheme is or why I can't use if to replace or as an identifier? I posted some code below.
    Thank's!



    ;if definition
    (define heiner-or
    (lambda (test-1 test-2)
    (if test-1
    #t
    test-2)))

    ;or definition
    > (heiner-or (= 10 10) (> 2 5))
    #t
    > (heiner-or (> 23 42) (< 5 2))
    #f









    share|improve this question



























      1












      1








      1








      does somebody know what the difference between if and or in Scheme is or why I can't use if to replace or as an identifier? I posted some code below.
      Thank's!



      ;if definition
      (define heiner-or
      (lambda (test-1 test-2)
      (if test-1
      #t
      test-2)))

      ;or definition
      > (heiner-or (= 10 10) (> 2 5))
      #t
      > (heiner-or (> 23 42) (< 5 2))
      #f









      share|improve this question
















      does somebody know what the difference between if and or in Scheme is or why I can't use if to replace or as an identifier? I posted some code below.
      Thank's!



      ;if definition
      (define heiner-or
      (lambda (test-1 test-2)
      (if test-1
      #t
      test-2)))

      ;or definition
      > (heiner-or (= 10 10) (> 2 5))
      #t
      > (heiner-or (> 23 42) (< 5 2))
      #f






      functional-programming scheme






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 16 '18 at 8:36







      user6825883

















      asked Nov 16 '18 at 8:29









      user6825883user6825883

      177




      177
























          1 Answer
          1






          active

          oldest

          votes


















          2














          Take a look at the documentation for if and or. if is used for testing a condition and executing only one of two possible values - if the condition is true the first part will get executed, if it's false the second part will get executed:



          (if (= 1 0)
          "not executed"
          "executed")
          => "executed"


          or is a logical connector that can receive multiple arguments, it'll return the first non-false value it finds, or false if all values are false. Typically you'd use or to connect boolean expressions, but that's not always the case:



          (or #f 7 10)
          => 7

          (or (= 1 0) (= 1 2))
          => #f


          Also bear in mind that in Scheme all values are considered true, except #f, which is false. Regarding the last part of your question: yes, you can use if to simulate an or, it would be something like this:



          ; equivalent to (or value1 value2)
          (if value1
          value1
          value2)


          The above is a simplification, because ideally we should evaluate value1 exactly once, and also because this version doesn't support multiple arguments. But beware: the moment you try to write it as a procedure you'll run into trouble!



          (define (my-or value1 value2)
          (if value1
          value1
          value2))


          That will not work as an or, the procedure evaluates both arguments before evaluating the if, whereas a real or only evaluates the needed expressions until it finds a true value - that's what we call short-circuit evaluation. To see what I mean, try this:



          (or 42 (/ 1 0))
          => 42
          (my-or 42 (/ 1 0))
          => /: division by zero


          We can't truly implement or, if as procedures, they're special forms and need to be implemented at the interpreter level, with special evaluation rules.






          share|improve this answer

























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53334040%2fscheme-difference-between-if-and-or%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            2














            Take a look at the documentation for if and or. if is used for testing a condition and executing only one of two possible values - if the condition is true the first part will get executed, if it's false the second part will get executed:



            (if (= 1 0)
            "not executed"
            "executed")
            => "executed"


            or is a logical connector that can receive multiple arguments, it'll return the first non-false value it finds, or false if all values are false. Typically you'd use or to connect boolean expressions, but that's not always the case:



            (or #f 7 10)
            => 7

            (or (= 1 0) (= 1 2))
            => #f


            Also bear in mind that in Scheme all values are considered true, except #f, which is false. Regarding the last part of your question: yes, you can use if to simulate an or, it would be something like this:



            ; equivalent to (or value1 value2)
            (if value1
            value1
            value2)


            The above is a simplification, because ideally we should evaluate value1 exactly once, and also because this version doesn't support multiple arguments. But beware: the moment you try to write it as a procedure you'll run into trouble!



            (define (my-or value1 value2)
            (if value1
            value1
            value2))


            That will not work as an or, the procedure evaluates both arguments before evaluating the if, whereas a real or only evaluates the needed expressions until it finds a true value - that's what we call short-circuit evaluation. To see what I mean, try this:



            (or 42 (/ 1 0))
            => 42
            (my-or 42 (/ 1 0))
            => /: division by zero


            We can't truly implement or, if as procedures, they're special forms and need to be implemented at the interpreter level, with special evaluation rules.






            share|improve this answer






























              2














              Take a look at the documentation for if and or. if is used for testing a condition and executing only one of two possible values - if the condition is true the first part will get executed, if it's false the second part will get executed:



              (if (= 1 0)
              "not executed"
              "executed")
              => "executed"


              or is a logical connector that can receive multiple arguments, it'll return the first non-false value it finds, or false if all values are false. Typically you'd use or to connect boolean expressions, but that's not always the case:



              (or #f 7 10)
              => 7

              (or (= 1 0) (= 1 2))
              => #f


              Also bear in mind that in Scheme all values are considered true, except #f, which is false. Regarding the last part of your question: yes, you can use if to simulate an or, it would be something like this:



              ; equivalent to (or value1 value2)
              (if value1
              value1
              value2)


              The above is a simplification, because ideally we should evaluate value1 exactly once, and also because this version doesn't support multiple arguments. But beware: the moment you try to write it as a procedure you'll run into trouble!



              (define (my-or value1 value2)
              (if value1
              value1
              value2))


              That will not work as an or, the procedure evaluates both arguments before evaluating the if, whereas a real or only evaluates the needed expressions until it finds a true value - that's what we call short-circuit evaluation. To see what I mean, try this:



              (or 42 (/ 1 0))
              => 42
              (my-or 42 (/ 1 0))
              => /: division by zero


              We can't truly implement or, if as procedures, they're special forms and need to be implemented at the interpreter level, with special evaluation rules.






              share|improve this answer




























                2












                2








                2







                Take a look at the documentation for if and or. if is used for testing a condition and executing only one of two possible values - if the condition is true the first part will get executed, if it's false the second part will get executed:



                (if (= 1 0)
                "not executed"
                "executed")
                => "executed"


                or is a logical connector that can receive multiple arguments, it'll return the first non-false value it finds, or false if all values are false. Typically you'd use or to connect boolean expressions, but that's not always the case:



                (or #f 7 10)
                => 7

                (or (= 1 0) (= 1 2))
                => #f


                Also bear in mind that in Scheme all values are considered true, except #f, which is false. Regarding the last part of your question: yes, you can use if to simulate an or, it would be something like this:



                ; equivalent to (or value1 value2)
                (if value1
                value1
                value2)


                The above is a simplification, because ideally we should evaluate value1 exactly once, and also because this version doesn't support multiple arguments. But beware: the moment you try to write it as a procedure you'll run into trouble!



                (define (my-or value1 value2)
                (if value1
                value1
                value2))


                That will not work as an or, the procedure evaluates both arguments before evaluating the if, whereas a real or only evaluates the needed expressions until it finds a true value - that's what we call short-circuit evaluation. To see what I mean, try this:



                (or 42 (/ 1 0))
                => 42
                (my-or 42 (/ 1 0))
                => /: division by zero


                We can't truly implement or, if as procedures, they're special forms and need to be implemented at the interpreter level, with special evaluation rules.






                share|improve this answer















                Take a look at the documentation for if and or. if is used for testing a condition and executing only one of two possible values - if the condition is true the first part will get executed, if it's false the second part will get executed:



                (if (= 1 0)
                "not executed"
                "executed")
                => "executed"


                or is a logical connector that can receive multiple arguments, it'll return the first non-false value it finds, or false if all values are false. Typically you'd use or to connect boolean expressions, but that's not always the case:



                (or #f 7 10)
                => 7

                (or (= 1 0) (= 1 2))
                => #f


                Also bear in mind that in Scheme all values are considered true, except #f, which is false. Regarding the last part of your question: yes, you can use if to simulate an or, it would be something like this:



                ; equivalent to (or value1 value2)
                (if value1
                value1
                value2)


                The above is a simplification, because ideally we should evaluate value1 exactly once, and also because this version doesn't support multiple arguments. But beware: the moment you try to write it as a procedure you'll run into trouble!



                (define (my-or value1 value2)
                (if value1
                value1
                value2))


                That will not work as an or, the procedure evaluates both arguments before evaluating the if, whereas a real or only evaluates the needed expressions until it finds a true value - that's what we call short-circuit evaluation. To see what I mean, try this:



                (or 42 (/ 1 0))
                => 42
                (my-or 42 (/ 1 0))
                => /: division by zero


                We can't truly implement or, if as procedures, they're special forms and need to be implemented at the interpreter level, with special evaluation rules.







                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Nov 16 '18 at 9:26

























                answered Nov 16 '18 at 9:07









                Óscar LópezÓscar López

                176k24225322




                176k24225322






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53334040%2fscheme-difference-between-if-and-or%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    這個網誌中的熱門文章

                    Xamarin.form Move up view when keyboard appear

                    Post-Redirect-Get with Spring WebFlux and Thymeleaf

                    Anylogic : not able to use stopDelay()