emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Add tests for ob-haskell (GHCi)


From: Bruno Barbier
Subject: Re: [PATCH] Add tests for ob-haskell (GHCi)
Date: Thu, 07 Sep 2023 16:21:44 +0200

Hi Ihor,

Sorry for the delay, thanks again for the ping.



Ihor Radchenko <yantar92@posteo.net> writes:

> Bruno Barbier <brubar.cs@gmail.com> writes:
>
>>>> +              (when (bufferp "*haskell*") (error "Conflicting buffer 
>>>> '*haskell*', rename it or kill it."))
>>>> +              (with-current-buffer session (rename-buffer "*haskell*")))
>>>
>>> So, you are now renaming the unique session buffer back to "*haskell*".
>>> And never rename it back to expected :session <value>. Users might be 
>>> confused.
>>
>> I do rename it back once inf-haskell has initialized the buffer (after
>> run-haskell in the last version).
>
> A comment would help to clarify things for the readers.

Right. I've improved the comment. Thanks.


>>>> +            (save-window-excursion
>>>> +              ;; We don't use `run-haskell' to not popup the buffer.
>>>> +              ;; And we protect default-directory.
>>>> +              (let ((default-directory default-directory))
>>>> +                (inferior-haskell-start-process))
>>>




>> About 'default-directory', I'm not sure. Maybe the side effect is done
>> on purpose in inf-haskell.
>
> I can see the haskell-mode overrides default-directory with
> `inferior-haskell-root-dir', running ghci in that directory, if it is
> non-nil. Even with your let binding, it is calling for trouble when
> source block uses :dir header argument.
>
> Maybe we can bind `inferior-haskell-root-dir' to `default-directory'
> instead? `default-directory' is modified according to :dir by ob-core.el
> when necessary.

You may be right that we should use `inferior-haskell-root-dir' to
tell haskell-mode where to run the interpreter.  Done.



>> The function 'putStr' output the string without a newline on stdout
>> (as opposed to the function putStrLn that does add a newline).
>>
>> So, in GHCi, entering:
>>
>>     putStr("4")
>>     
>> outputs "4" on stdout, then GHCi outputs the prompt, so we get:
>>
>>     4ghci> 
>>
>> In the end, 'org-babel-comint-with-output' gets this
>>     1ghci> 2ghci> 3ghci> 
>>     ghci> org-babel-haskell-eoe
>>     ghci> ghci>
>>     
>> and filters out everything as being GHCi prompts and the EOE.
>>
>> I'm not really expecting this to be fixed; I just wanted to record the
>> fact.
>
> We actually might be able to deal with this if we change the prompt and
> update comint-prompt-regexp to something more accurate.

I couldn't make it work by simply restricting the prompt.  I think
it's OK if character by character output doesn't work; ghci is about
line based interaction afterall.



>>>> Subject: [PATCH 11/13] lisp/ob-haskell.el: Fix how to use sessions
>>>>
>>>> +  (org-babel-haskell-with-session
>>>
>>> This kind of names are usually dedicated to macro calls. But
>>> `org-babel-haskell-with-session' is instead a function. I think a macro
>>> will be better. And you will be able to get rid of unnecessary lambda.
>>
>> That looks kind of complicated just to avoid one lambda in one call.
>> But, as I couldn't find a better name, I've translated it into a
>> macro.
>
> I think you misunderstood what I meant.
> See the attached diff on top of your patches that simplifies things a
> bit.
> diff --git a/lisp/ob-haskell.el b/lisp/ob-haskell.el
...
>  (defmacro org-babel-haskell-with-session (session-symbol params &rest body)
>    "Get the session identified by PARAMS and run BODY with it.
.. 
> +  `(let* ((params ,params)
> +          (sn (cdr (assq :session params)))
> +          (session (org-babel-haskell-initiate-session sn params))
> +          (,session-symbol session)
> +          (one-shot (equal sn "none")))
> +     (unwind-protect
> +         (progn ,@body)

I don't think it's correct to create local variables like this in a
macro: we need to use uninterned symbols, else we may capture caller
variables (params, sn, session and one-shot).

I personnaly find it easier when I keep my macros as short as
possible, and, to do any non-trivial work in a function: easier to
read, to modify and to debug.




>>>> -    (let ((buffer (org-babel-haskell-initiate-session session)))
>>>> +    (let ((buffer (org-babel-haskell-initiate-session session params)))
>>>
>>> PARAMS argument is ignored by `org-babel-haskell-initiate-session'. I am
>>> not sure why you are trying to pass it here.
>>
>> We have the PARAMS, and, org-babel-haskell-initiate-session has a
>> PARAMS arguments. So, at the API level, I think it's better to
>> propagate it than to ignore it.  But you're right that, today, the
>> current implementation ignores it.
>>
>> I'm fine with dropping that change if you so prefer.
>
> I am mostly neutral here. Slightly in favour of keeping things unchanged.

I've removed my change. The function `org-babel-load-session:haskell`
now ignores the parameter PARAMS, as before.


Thanks for the review.


Bruno

Attachment: 0001-ob-haskell-Add-tests-for-GHCi.patch
Description: Text Data

Attachment: 0002-org-babel-haskell-initiate-session-Remove-secondary-.patch
Description: Text Data

Attachment: 0003-testing-lisp-test-ob-haskell-ghci.el-Fix-some-tests.patch
Description: Text Data

Attachment: 0004-testing-lisp-test-ob-haskell-ghci.el-Enable-fixed-te.patch
Description: Text Data

Attachment: 0005-lisp-ob-haskell-Request-the-last-value-from-GHCi.patch
Description: Text Data

Attachment: 0006-ob-haskell-Implement-sessions.patch
Description: Text Data

Attachment: 0007-testing-lisp-test-ob-haskell-ghci.el-Test-output-wit.patch
Description: Text Data


reply via email to

[Prev in Thread] Current Thread [Next in Thread]