Error in case construct with string comparison (scheme)





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















(define aaa ;;val:string  
(lambda(x) ;;x:string
(case
((string=? (substring x 0 1) "+") (aaa(substring x 1)))
((string=? "a" "b")(string-append("-" (aaa(substring x 1)))))
((char=?(string-ref x 0)#.) (-404))
(else
(if (= (findpoint x) -1)
"a"
"b"
)
)
)
)
)


Hello, I have a problem with DrRacket:
When I try to run this code, it gives me the error:




case: expected a symbol (without its quote) or a number as a choice, but found a string




referring to the line (5):




((string=? "a" "b")(string-append("-" (aaa(substring x 1)))))




This line was actually supposed to look like this,




((string=? (substring x 0 1) "+")(string-append("-" (aaa(substring x 1)))))




but I thought that using two strings "a" "b" would ease to spot the problem.
I don't understand why i get this error, since both "a" "b" are strings and not symbols or lists, and also I can't understand why I don't get this error on the previous line



CONTEXT:
the procedure is supposed check if the first character of a string is a +/-/., and then do thing through recursion using else (again, "a" "b" are examples)










share|improve this question





























    0















    (define aaa ;;val:string  
    (lambda(x) ;;x:string
    (case
    ((string=? (substring x 0 1) "+") (aaa(substring x 1)))
    ((string=? "a" "b")(string-append("-" (aaa(substring x 1)))))
    ((char=?(string-ref x 0)#.) (-404))
    (else
    (if (= (findpoint x) -1)
    "a"
    "b"
    )
    )
    )
    )
    )


    Hello, I have a problem with DrRacket:
    When I try to run this code, it gives me the error:




    case: expected a symbol (without its quote) or a number as a choice, but found a string




    referring to the line (5):




    ((string=? "a" "b")(string-append("-" (aaa(substring x 1)))))




    This line was actually supposed to look like this,




    ((string=? (substring x 0 1) "+")(string-append("-" (aaa(substring x 1)))))




    but I thought that using two strings "a" "b" would ease to spot the problem.
    I don't understand why i get this error, since both "a" "b" are strings and not symbols or lists, and also I can't understand why I don't get this error on the previous line



    CONTEXT:
    the procedure is supposed check if the first character of a string is a +/-/., and then do thing through recursion using else (again, "a" "b" are examples)










    share|improve this question

























      0












      0








      0








      (define aaa ;;val:string  
      (lambda(x) ;;x:string
      (case
      ((string=? (substring x 0 1) "+") (aaa(substring x 1)))
      ((string=? "a" "b")(string-append("-" (aaa(substring x 1)))))
      ((char=?(string-ref x 0)#.) (-404))
      (else
      (if (= (findpoint x) -1)
      "a"
      "b"
      )
      )
      )
      )
      )


      Hello, I have a problem with DrRacket:
      When I try to run this code, it gives me the error:




      case: expected a symbol (without its quote) or a number as a choice, but found a string




      referring to the line (5):




      ((string=? "a" "b")(string-append("-" (aaa(substring x 1)))))




      This line was actually supposed to look like this,




      ((string=? (substring x 0 1) "+")(string-append("-" (aaa(substring x 1)))))




      but I thought that using two strings "a" "b" would ease to spot the problem.
      I don't understand why i get this error, since both "a" "b" are strings and not symbols or lists, and also I can't understand why I don't get this error on the previous line



      CONTEXT:
      the procedure is supposed check if the first character of a string is a +/-/., and then do thing through recursion using else (again, "a" "b" are examples)










      share|improve this question














      (define aaa ;;val:string  
      (lambda(x) ;;x:string
      (case
      ((string=? (substring x 0 1) "+") (aaa(substring x 1)))
      ((string=? "a" "b")(string-append("-" (aaa(substring x 1)))))
      ((char=?(string-ref x 0)#.) (-404))
      (else
      (if (= (findpoint x) -1)
      "a"
      "b"
      )
      )
      )
      )
      )


      Hello, I have a problem with DrRacket:
      When I try to run this code, it gives me the error:




      case: expected a symbol (without its quote) or a number as a choice, but found a string




      referring to the line (5):




      ((string=? "a" "b")(string-append("-" (aaa(substring x 1)))))




      This line was actually supposed to look like this,




      ((string=? (substring x 0 1) "+")(string-append("-" (aaa(substring x 1)))))




      but I thought that using two strings "a" "b" would ease to spot the problem.
      I don't understand why i get this error, since both "a" "b" are strings and not symbols or lists, and also I can't understand why I don't get this error on the previous line



      CONTEXT:
      the procedure is supposed check if the first character of a string is a +/-/., and then do thing through recursion using else (again, "a" "b" are examples)







      scheme






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 26 '18 at 18:34









      ArzoArzo

      86




      86
























          1 Answer
          1






          active

          oldest

          votes


















          0














          It seems like you are mixing cond, the flat if-elseif-else, and case, which is similar to a switch statement.



          How to use cond:



          (cond ((equal? 1 2) 'consequent)
          ((odd? 1) 'consequent2) ; as many terms as you want. It stops at the first true
          (else 'alternative)) ; or else it evaluates the alterntaive
          ; ==> consequent2


          Vs how to use case



          (case 'value4
          ((value1 value2) 'consequent)
          ((value3 value4) 'consequent2)
          (else 'default))
          ; ==> consequent2


          Now that case statement is just sugar. Your Scheme implementation will make it into something similar to this:



          (cond ((and (eqv? 'value4 'value1) (eqv? 'value4 'value2)) 'consequent)
          ((and (eqv? 'value4 'value3) (eqv? 'value4 'value4)) 'consequent2)
          (else 'default))


          Thus notice the values to match in a case are treated as if they are quoted. Eg. you values can not be variables since they will only match their symbol.



          If you want to use case I would have done this:



          (define (first-letter-operator? str)
          (case (string-ref str 0)
          ((#+ #- #.) #t)
          (else #f)))

          (first-letter-operator? "+345634") ; ==> #t
          (first-letter-operator? "hello") ; ==> #f





          share|improve this answer


























          • Wow, I mixed up the two things, and i didn't notice... Sorry for the waste of time and thanks for the help!

            – Arzo
            Nov 26 '18 at 20:01












          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%2f53487104%2ferror-in-case-construct-with-string-comparison-scheme%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









          0














          It seems like you are mixing cond, the flat if-elseif-else, and case, which is similar to a switch statement.



          How to use cond:



          (cond ((equal? 1 2) 'consequent)
          ((odd? 1) 'consequent2) ; as many terms as you want. It stops at the first true
          (else 'alternative)) ; or else it evaluates the alterntaive
          ; ==> consequent2


          Vs how to use case



          (case 'value4
          ((value1 value2) 'consequent)
          ((value3 value4) 'consequent2)
          (else 'default))
          ; ==> consequent2


          Now that case statement is just sugar. Your Scheme implementation will make it into something similar to this:



          (cond ((and (eqv? 'value4 'value1) (eqv? 'value4 'value2)) 'consequent)
          ((and (eqv? 'value4 'value3) (eqv? 'value4 'value4)) 'consequent2)
          (else 'default))


          Thus notice the values to match in a case are treated as if they are quoted. Eg. you values can not be variables since they will only match their symbol.



          If you want to use case I would have done this:



          (define (first-letter-operator? str)
          (case (string-ref str 0)
          ((#+ #- #.) #t)
          (else #f)))

          (first-letter-operator? "+345634") ; ==> #t
          (first-letter-operator? "hello") ; ==> #f





          share|improve this answer


























          • Wow, I mixed up the two things, and i didn't notice... Sorry for the waste of time and thanks for the help!

            – Arzo
            Nov 26 '18 at 20:01
















          0














          It seems like you are mixing cond, the flat if-elseif-else, and case, which is similar to a switch statement.



          How to use cond:



          (cond ((equal? 1 2) 'consequent)
          ((odd? 1) 'consequent2) ; as many terms as you want. It stops at the first true
          (else 'alternative)) ; or else it evaluates the alterntaive
          ; ==> consequent2


          Vs how to use case



          (case 'value4
          ((value1 value2) 'consequent)
          ((value3 value4) 'consequent2)
          (else 'default))
          ; ==> consequent2


          Now that case statement is just sugar. Your Scheme implementation will make it into something similar to this:



          (cond ((and (eqv? 'value4 'value1) (eqv? 'value4 'value2)) 'consequent)
          ((and (eqv? 'value4 'value3) (eqv? 'value4 'value4)) 'consequent2)
          (else 'default))


          Thus notice the values to match in a case are treated as if they are quoted. Eg. you values can not be variables since they will only match their symbol.



          If you want to use case I would have done this:



          (define (first-letter-operator? str)
          (case (string-ref str 0)
          ((#+ #- #.) #t)
          (else #f)))

          (first-letter-operator? "+345634") ; ==> #t
          (first-letter-operator? "hello") ; ==> #f





          share|improve this answer


























          • Wow, I mixed up the two things, and i didn't notice... Sorry for the waste of time and thanks for the help!

            – Arzo
            Nov 26 '18 at 20:01














          0












          0








          0







          It seems like you are mixing cond, the flat if-elseif-else, and case, which is similar to a switch statement.



          How to use cond:



          (cond ((equal? 1 2) 'consequent)
          ((odd? 1) 'consequent2) ; as many terms as you want. It stops at the first true
          (else 'alternative)) ; or else it evaluates the alterntaive
          ; ==> consequent2


          Vs how to use case



          (case 'value4
          ((value1 value2) 'consequent)
          ((value3 value4) 'consequent2)
          (else 'default))
          ; ==> consequent2


          Now that case statement is just sugar. Your Scheme implementation will make it into something similar to this:



          (cond ((and (eqv? 'value4 'value1) (eqv? 'value4 'value2)) 'consequent)
          ((and (eqv? 'value4 'value3) (eqv? 'value4 'value4)) 'consequent2)
          (else 'default))


          Thus notice the values to match in a case are treated as if they are quoted. Eg. you values can not be variables since they will only match their symbol.



          If you want to use case I would have done this:



          (define (first-letter-operator? str)
          (case (string-ref str 0)
          ((#+ #- #.) #t)
          (else #f)))

          (first-letter-operator? "+345634") ; ==> #t
          (first-letter-operator? "hello") ; ==> #f





          share|improve this answer















          It seems like you are mixing cond, the flat if-elseif-else, and case, which is similar to a switch statement.



          How to use cond:



          (cond ((equal? 1 2) 'consequent)
          ((odd? 1) 'consequent2) ; as many terms as you want. It stops at the first true
          (else 'alternative)) ; or else it evaluates the alterntaive
          ; ==> consequent2


          Vs how to use case



          (case 'value4
          ((value1 value2) 'consequent)
          ((value3 value4) 'consequent2)
          (else 'default))
          ; ==> consequent2


          Now that case statement is just sugar. Your Scheme implementation will make it into something similar to this:



          (cond ((and (eqv? 'value4 'value1) (eqv? 'value4 'value2)) 'consequent)
          ((and (eqv? 'value4 'value3) (eqv? 'value4 'value4)) 'consequent2)
          (else 'default))


          Thus notice the values to match in a case are treated as if they are quoted. Eg. you values can not be variables since they will only match their symbol.



          If you want to use case I would have done this:



          (define (first-letter-operator? str)
          (case (string-ref str 0)
          ((#+ #- #.) #t)
          (else #f)))

          (first-letter-operator? "+345634") ; ==> #t
          (first-letter-operator? "hello") ; ==> #f






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 26 '18 at 19:20

























          answered Nov 26 '18 at 19:15









          SylwesterSylwester

          35.4k22956




          35.4k22956













          • Wow, I mixed up the two things, and i didn't notice... Sorry for the waste of time and thanks for the help!

            – Arzo
            Nov 26 '18 at 20:01



















          • Wow, I mixed up the two things, and i didn't notice... Sorry for the waste of time and thanks for the help!

            – Arzo
            Nov 26 '18 at 20:01

















          Wow, I mixed up the two things, and i didn't notice... Sorry for the waste of time and thanks for the help!

          – Arzo
          Nov 26 '18 at 20:01





          Wow, I mixed up the two things, and i didn't notice... Sorry for the waste of time and thanks for the help!

          – Arzo
          Nov 26 '18 at 20:01




















          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%2f53487104%2ferror-in-case-construct-with-string-comparison-scheme%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







          Popular posts from this blog

          Wiesbaden

          Marschland

          Dieringhausen