libera/#lisp - IRC Chatlog
Search
15:32:00
x8dcc
How is `quote' usually implemented? A quoted expression should evaluate to itself, but that doesn't really sound accurate since (((lambda (x) x) '+) 1 2) is not valid
15:33:45
x8dcc
One of the reasons I am asking is because in my toy Lisp, I can't add quote as a normal C primitive since the arguments are evaluated inside `apply' before calling the function (quote in this case)
17:18:18
ieure
x8dcc, In your example, you seem to be confusing + (which is a symbol) with the value bound to that symbol, which is a function. '+ returns the symbol, + returns the value.
17:21:21
x8dcc
but a quoted symbol doesn't evaluate to its bound value unless you `eval' it explicitly, right?
17:24:51
ieure
Right, your lambda is the identity function, so the 'x passes through it; you code simplifies to: ('+ 1 2)
17:29:44
ieure
(quote x) is a special form; special forms have different evaluation rules, so I'd expect the place where code is evaluated is where you'd implement those behaviors.
17:30:49
x8dcc
Well, right now the quotes work fine. I have a is_quoted member in my expression struct, and if it's true in the expression that `eval' is evaluating, it returns the expression unchanged
17:31:27
x8dcc
The 'symbol form (with the single quote) works fine because it's implemented when parsing the user input, but the (quote symbol) form is a bit trickier
17:32:34
ieure
It sounds like you're implementation is cutting across concerns. 'foo is a reader macro which expands to (quote symbol) -- the former should work *before* the latter.
17:33:02
x8dcc
ieure: I don't currently have closures, but I have C primitives. In `eval', if the expression is a list, it evaluates the car and sends the cdr to `apply', who evaluates each argument and calls the C primitive
17:33:47
x8dcc
ieure: I know, it was the idea, but I had to remove the (quote symbol) form when I added the environments because I didn't really know how to implement it
17:34:39
ieure
I don't really understand what you're saying. Closures are an orthogonal concern here.
17:36:51
ieure
Your evaluator should be looking at the car of the form it's given to see whether it's a special operator, and invoking whatever behavior it needs. It should never see a 'quoted symbol, because that's syntax sugar which shouldn't exist at that level.
17:37:41
ieure
It would be like your evaluator doing stuff with code comments -- that stuff shouldn't be visible at the level it's operating at.
17:38:29
x8dcc
ieure: I see. The evaluator doesn't see the 'symbol form, it just sees that the expression that it should evaluate is quoted (expr->is_quoted). What I meant is that when the parser encoutners a single quote, it marks the next expression as quoted. I agree that it should be just expanding it to (quote symbol)
17:40:14
ieure
x8dcc, Read is the function which turns the textual representation of s-expressions into lists. (read "(foo bar)") ;; => (foo bar)
17:40:21
x8dcc
If you want, I can send the code so you can see exactly what does what, but I doubt you want to spend your time there :p
17:40:56
x8dcc
ieure: I see. I handle that entirely from C. The raw user text is converted to an array of Token structures which is converted into an initial Expr structure
17:40:58
ieure
Reader macros are functions which are applied to the text which expand it into different list representations; that's the stuff that converts 'foo to (quote foo).
17:44:26
ieure
What I'd suggest is changing your reader to handle this stuff and removing is_quoted from your Token. It's wasteful to have every Token say whether it's quoted when the majority won't be.
17:46:28
ieure
x8dcc, Recommend you read SICP and/or Lisp in Small Pieces if you want to implement your own Lisp. No need to rediscover everything from first principles.
17:47:41
x8dcc
I am confused about not using is_quoted. For example: ((lambda (x) x) (quote my-symbol)) When calling the lambda, `apply' would evaluate the quote, which would return my-symbol, right?
17:48:15
x8dcc
ieure: I have read parts of SICP, it's why I wanted to make my own lisp in the first place. Just today I was searching for information on quotes :)
17:52:43
ieure
This is getting a bit out of my experience, but I'm not sure why apply would be evaluating anything; that's eval's job.
17:53:39
x8dcc
I meant `apply' would call `eval' on each argument before passing it to the function.
17:53:49
x8dcc
Sorry if I don't explain myself really clear, I am new with all this and english isn't even my first language.
17:54:15
ieure
x8dcc, You're doing great on the English! I honestly couldn't tell that you weren't a native speaker.
17:55:19
x8dcc
jcowan: I guess one of my questions is: If `eval' handles special primitives like `quote', what does it return so the caller knows that the expression was quoted? Without using `expr->is_quoted' like ieure said
17:57:24
x8dcc
That's why I asked: If `apply' calls `eval' on the arguments, how does the lambda know that my-symbol is quoted? ((lambda (x) x) (quote my-symbol))
18:02:05
jcowan
eval-ing (+ a b) recursively evals +, a, and b and then applies the addition function to the values of a and b
18:03:31
x8dcc
But `eval' doesn't evaluate the arguments *before* calling `apply', it only evaluates the car. `apply' calls `eval' on each argument
18:05:39
jackdaniel
x8dcc: keeping aside how you process the first argument, the application rule is: evaluate all arguments and then pass them to the function
18:06:34
jackdaniel
allowing for the operator to evaluate (or not) the argument is a domain of special operators, macros and fexpressions
18:07:17
x8dcc
Hmmm, I see. This is where I saw `apply' calling `eval' (Chapter 5): https://github.com/Robert-van-Engelen/tinylisp/blob/main/tinylisp.pdf
18:10:45
x8dcc
Ah, I just noticed. In SICP, the arguments are evaluated before calling apply in `list-of-values'... Pg. 498
18:11:25
x8dcc
I am going to change that now, and I will see if the quote issue becomes clearer. Thank you for your help, everyone, I learned a lot :)