5 ms·
It is not as trivial as you think, but it is possible. M-x in Emacs does it. But it is certainly not as simple as "just remove start and end parenthesis" :-). I
by amno 3y ago
It is not as trivial as you think, but it is possible. M-x in Emacs does it. But it is certainly not as simple as "just remove start and end parenthesis" :-). In a Lisp-2 if you type a symbol "foo" without parens, you are asking for symbol foos value as a variable, but it you type (foo) you are asking for symbol foos value as a function. Since every symbol in a Lisp-2 language (Common Lisp, Emacs Lisp some other possibly) can have both variable value and function object assign to it, how would system know which one you ask for?
Anyway, it is possible to do, for example M-x in Emacs does it. They do it by means of restricting repl to execute only functions, and they limit that to special function with so-called "interactive" form, whose job is to provide function arguments.
- lispm 3y agoLispWorks does that too - if the function has an argument. CL-USER 18 > + 1 2 3 CL-USER 19 > first (list 1 2 3) 1
- amno 3y agoHah! Why am I not surprised to see that nick on HN too :-) I have no experience with LispWorks whatsoever, but I am curious, how did they implemented it if you know? I mean, how do they differ between calling first as a value or first as a function? In your example first could be a defvared to have some value, and then I might have called a function to produce some unrelated output. I mean it is a contrived example, and probably nobody types in a repl like that, but the language does not forbid it since white spaces are insignificant. If they just treat the first token as operator always, than they could call any function with any arguments: CL-USER> op arg1 arg2 ... argN but then they would have to eval all values at the start of repl by calling (symbol-function arg), instead of just type arg to examine a value. I don't think it would be a bad think in itself tbh; but I am not sure the win is big enough to introduce a new concept. By the way, I think I have stumbled on some mailing list comment somewhere once, where they said, that Hemlock can use commands named more "english like", i.e. they can have names with spaces in it, not just the hyphenated function name as in Emacs. Do you know more about it, or how they have implemented it? I am just curious; seen your comments on Reddit, and if you are the same person, I understand you are well experienced and familiar with various Lisps and implementations; hope you don't mind asking. :)
- lispm 3y ago> how did they implemented it if you know? It's relatively easy: a variable: CL-USER> foo an operator with no arguments: CL-USER> (foo) an operator with one or more arguments: CL-USER> foo 1 CL-USER> foo 1 2 CL-USER> foo 1 (+ 1 2) (+ 3 4) and so on. > Hemlock can use commands named more "english like" That's like Emacs (called Zmacs) on the Lisp Machine does it. It does not use hyphens at all. I can't remember how the first Emacs, the TECO Emacs, did it. M-x compile-changed-definitions-of-buffer is then M-x Compile Changed Definition Of Buffer Basically instead of hyphens it uses spaces. In LispWorks & Zmacs one enters the command M-x Replace String <return> and then the editor prompts for the arguments.
- amno 3y ago> CL-USER> foo 1 > > CL-USER> foo 1 2 > > CL-USER> foo 1 (+ 1 2) (+ 3 4) But then they do have the problem I mentions: they can't distinguish between calling (foo 1 (+ 1 2) (+ 3 4)) and calling (foo 1) (+ 1 2) (+ 3 4). I don't think it is important ether, I certainly wouldn't type code like that in a repl either. I don't even know if sly/slime repl even support typing several expressions on the same line in repl. I am not at home to test it. > Basically instead of hyphens it uses spaces. > > In LispWorks & Zmacs one enters the command M-x Replace String <return> and then the editor prompts for the arguments. I understand, thanks. I thought they were a bit more finicky about it. I think that could be relatively easily done in Emacs as well, but I don't see much gain to implement a M-x replacement like that. Especially with modern completion systems like Helm and fuzzy completing which basically don't care how we type. Thank you for your time and answers.
- lispm 3y ago> they can't distinguish between calling (foo 1 (+ 1 2) (+ 3 4)) and calling (foo 1) (+ 1 2) (+ 3 4). It uses always (foo 1 (+ 1 2) (+ 3 4)). It uses the complete input. > I don't even know if sly/slime repl even support typing several expressions on the same line in repl. Most Lisp REPLs use multiline input. Here LispWorks requires that + 1 2 is on a single line. If one enters more than one expression to a single prompt, possibly on/spanning multiple lines, each will be executed. > but I don't see much gain It looks better. Much better. Minus: the command now has spaces in its name, which makes it more difficult to use in scripts.