Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revisionBoth sides next revision
tutorials:intermediate:json_prolog [2019/04/24 11:46] gkazhoyatutorials:intermediate:json_prolog [2019/04/24 11:53] – [Case-sensitive variable names] gkazhoya
Line 210: Line 210:
 ==== Case-sensitive variable names ==== ==== Case-sensitive variable names ====
  
-In the former query we got a weird result from Prolog which looked like this: ''|''helloworld''|''.+In the former query we got a weird result from Prolog which looked like this:  
 +<code lisp> 
 +|''helloworld''| 
 +</code> 
 +What do the pipes stand for in this case?
  
 +Lisp is case-insensitive, that means that variable of function names, or more correctly said, any symbol, can be written in any capitalization and will refer to the same symbol:
  
 +<code lisp>
 +CL-USER> (eq 'hello 'HELLO)
 +T
 +CL-USER> (eq 'hello 'Hello)
 +T
 +</code>
 +
 +Prolog, on the other hand, is case-sensitive.
 +And in some cases, one would like to have a case-sensitive variable in Lisp as well.
 +This is where the pipes come into play:
 +<code lisp>
 +CL-USER> (intern "HELLO")
 +HELLO
 +:INTERNAL
 +CL-USER> (intern "Hello")
 +|Hello|
 +NIL
 +</code>
 +The function ''intern'' creates a symbol from a string.
 +If the string is all capital, we get a normal usual symbol, in the other case we get the pipes.
 +
 +The same is with Prolog, if you variable or any other symbol is not all caps, you will get a symbol in Lisp which has pipes around it:
 +
 +<code lisp>
 +CL-USER> (json-prolog:prolog-simple-1 "member(X, [1,2,3])")
 +(((?X . 1)))
 +CL-USER> (json-prolog:prolog-simple-1 "member(MYVAR, [1,2,3])")
 +(((?MYVAR . 1)))
 +CL-USER> (json-prolog:prolog-simple-1 "member(MY_VAR, [1,2,3])")
 +(((?MY_VAR . 1)))
 +CL-USER> (json-prolog:prolog-simple-1 "member(My_var, [1,2,3])")
 +(((|?My_var| . 1)))
 +</code>
 +
 +In that case, to get the value of the variable you should also use pipes:
 +
 +<code lisp>
 +CL-USER> (cut:var-value '|?My_var|
 +                        (car (json-prolog:prolog-simple-1 "member(My_var, [1,2,3])")))
 +1
 +</code>
 +
 +Please note that in Prolog, all variables have to start with a capital letter and cannot contain dashes:
 +<code lisp>
 +CL-USER> (json-prolog:prolog-simple-1 "member(x, [1,2,3])")
 +NIL
 +CL-USER> (json-prolog:prolog-simple-1 "member(MY-VAR, [1,2,3])")
 +NIL
 +</code>
 ==== (NIL) vs NIL ==== ==== (NIL) vs NIL ====