Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
tutorials:intermediate:json_prolog [2019/04/24 11:43] – [Importing a package with queries] gkazhoyatutorials:intermediate:json_prolog [2019/04/24 11:54] – [Case-sensitive variable names] gkazhoya
Line 207: Line 207:
 and if you check your terminal, in which the ''json_prolog'' node is running, there will be a huge java print as well, basically explaining the same thing. and if you check your terminal, in which the ''json_prolog'' node is running, there will be a huge java print as well, basically explaining the same thing.
      
-    + 
 +==== Case-sensitive variable names ==== 
 + 
 +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) 
 +
 +CL-USER> (eq 'hello 'Hello) 
 +
 +</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 your 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])"))) 
 +
 +</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 ====