From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp2 ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms11 with LMTPS id sGcWNjVIsF4sCQAA0tVLHw (envelope-from ) for ; Mon, 04 May 2020 16:52:05 +0000 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp2 with LMTPS id UMKSAEBIsF7ZGgAAB5/wlQ (envelope-from ) for ; Mon, 04 May 2020 16:52:16 +0000 Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:470:142::17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 6962D942060 for ; Mon, 4 May 2020 16:40:26 +0000 (UTC) Received: from localhost ([::1]:42618 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jVe8n-00020h-Jw for larch@yhetil.org; Mon, 04 May 2020 12:40:25 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:47904) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jVe85-0001ZG-R5 for emacs-orgmode@gnu.org; Mon, 04 May 2020 12:39:41 -0400 Received: from mail-oo1-xc2f.google.com ([2607:f8b0:4864:20::c2f]:42413) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1jVe84-0000gk-7F for emacs-orgmode@gnu.org; Mon, 04 May 2020 12:39:41 -0400 Received: by mail-oo1-xc2f.google.com with SMTP id e18so2532779oot.9 for ; Mon, 04 May 2020 09:39:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=1+HsP58CHv+h68tGYFIoOTn5gkLOJBpbXFxNEwygXFI=; b=mAAZAAYgIGAIE5IdkqS1Y6P9/uEZA0Aa8kdg3htmrR8PAEb/Sdw3xU64ZmiLDiB4cM JJK/mOFAXmXsSZBeGkZHMY/hxlY7f0IJPF54VbeS6xMrXrNDltLdFYrRx0KmbAz4An/z qCMQDuBZbycNwbXhXgPyT1zHtBAD40KrPgsMpxK8j6HIK+e8YASiHqOXHHwsz4yaqmq2 cAu0RFZF8dKX9VX4q5uVFHi3xcwLfvVbSEMiF39PsCCA8YYiPokAK9NIFUFZeI3efysM 8qL3HpQrnQlStaxOyLJ0ohhnYUFNkrni9reATIqBxH3WrTshq8GrccCcvkzVNwL5C5SS xTlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=1+HsP58CHv+h68tGYFIoOTn5gkLOJBpbXFxNEwygXFI=; b=bUKhMPEicEKNOY7c6o5/7ArftegBThjwLe//gO/FqdvjRxDhLlYjC8Pxu6h8kejlAC 79Di5r/Iy5rkv9Q7Zm8PyQuWVpPtTkGCqZ8/5tLB/BmNfq8shH43d4D8k3OgNhP7URwt f27KpanhGP9j1n3sQjI4utERsp9UrgyJrJDH9ERuUMa5r9qml/PdCO2lTevH+ykI5xXX lWKNSl7rrrvdZml2F5Z2p5gCVtk6QsVz0DnGMbzVhIKZ7RzXdKlTsZ+Odtt+CvhZJkP+ 3wjaTFtKFF4hDlY6WXrIVRxmpWMnh+Awkvk2yhmYgc7EvMtrvukF4jPExrZY+x5xP/2q QY5g== X-Gm-Message-State: AGi0PuZu5P/HKbm/tiaIiBji2Mhew+rC5ZVaw0IlfjM27kwGdSncaNN8 LXst6I6bI6AwR20edpRNZ2+gW8VLAldT0HVqX18= X-Google-Smtp-Source: APiQypIFGPkYz6Lw28d/9BVuEFTfYX73E/UVhJFOH8jEuiFEefTFga8Xq3FVge44zRHmfqTxl6JP0mJ9FVmZFn3pEJE= X-Received: by 2002:a4a:9442:: with SMTP id j2mr15759759ooi.37.1588610379025; Mon, 04 May 2020 09:39:39 -0700 (PDT) MIME-Version: 1.0 References: <87v9lb3enr.fsf@nicolasgoaziou.fr> In-Reply-To: <87v9lb3enr.fsf@nicolasgoaziou.fr> From: Roland Coeurjoly Date: Mon, 4 May 2020 18:39:27 +0200 Message-ID: Subject: Re: Fwd: Support compilation of Haskell in org mode babel blocks. To: Roland Coeurjoly , emacs-orgmode@gnu.org Content-Type: multipart/alternative; boundary="000000000000540fbd05a4d52d9d" Received-SPF: pass client-ip=2607:f8b0:4864:20::c2f; envelope-from=rolandcoeurjoly@gmail.com; helo=mail-oo1-xc2f.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: emacs-orgmode@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+larch=yhetil.org@gnu.org Sender: "Emacs-orgmode" X-Scanner: scn0 X-Spam-Score: -1.71 Authentication-Results: aspmx1.migadu.com; dkim=pass header.d=gmail.com header.s=20161025 header.b=mAAZAAYg; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (aspmx1.migadu.com: domain of emacs-orgmode-bounces@gnu.org designates 2001:470:142::17 as permitted sender) smtp.mailfrom=emacs-orgmode-bounces@gnu.org X-Scan-Result: default: False [-1.71 / 13.00]; GENERIC_REPUTATION(0.00)[-0.49496223630644]; TO_DN_SOME(0.00)[]; R_SPF_ALLOW(-0.20)[+ip6:2001:470:142::/48:c]; FREEMAIL_FROM(0.00)[gmail.com]; DWL_DNSWL_BLOCKED(0.00)[gmail.com:dkim,2001:470:142::17:from]; IP_REPUTATION_HAM(0.00)[asn: 22989(0.13), country: US(-0.00), ip: 2001:470:142::17(-0.49)]; DKIM_TRACE(0.00)[gmail.com:+]; RCPT_COUNT_TWO(0.00)[2]; DMARC_POLICY_ALLOW(-0.50)[gmail.com,none]; MX_GOOD(-0.50)[cached: eggs.gnu.org]; MAILLIST(-0.20)[mailman]; FREEMAIL_TO(0.00)[gmail.com,gnu.org]; FORGED_RECIPIENTS_MAILLIST(0.00)[]; MIME_TRACE(0.00)[0:+,1:+,2:~]; RCVD_TLS_LAST(0.00)[]; ASN(0.00)[asn:22989, ipnet:2001:470:142::/48, country:US]; TAGGED_FROM(0.00)[larch=yhetil.org]; FROM_NEQ_ENVFROM(0.00)[rolandcoeurjoly@gmail.com,emacs-orgmode-bounces@gnu.org]; ARC_NA(0.00)[]; R_DKIM_ALLOW(-0.20)[gmail.com:s=20161025]; RCVD_COUNT_FIVE(0.00)[5]; FROM_HAS_DN(0.00)[]; URIBL_BLOCKED(0.00)[stackexchange.com:url,nicolasgoaziou.fr:email]; MIME_GOOD(-0.10)[multipart/alternative,text/plain]; PREVIOUSLY_DELIVERED(0.00)[emacs-orgmode@gnu.org]; HAS_LIST_UNSUB(-0.01)[]; DNSWL_BLOCKED(0.00)[2001:470:142::17:from]; FORGED_SENDER_MAILLIST(0.00)[] X-TUID: OZ7Nluywj2LB --000000000000540fbd05a4d52d9d Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable I am confused about the last point: Use a let-binding instead of setq. If I use: (let* compile (string=3D (cdr (assq :compile params)) "yes")) I get the following error: ob-haskell.el:158:1: Error: Wrong type argument: listp, compile If I leave with set: (setq compile (string=3D (cdr (assq :compile params)) "yes")) I get the following warnings: ob-haskell.el:161:12: Warning: assignment to free variable =E2=80=98compile= =E2=80=99 ob-haskell.el:161:12: Warning: reference to free variable =E2=80=98compile= =E2=80=99 Upon searching the web, I find a relevant this relevant post , whose conclusion (if I understand it correctly) is that we could live with those warning raised by setq. Apart from this issue I am ready to submit a fixed patch. What do you recommend? On Mon, May 4, 2020 at 5:26 PM Nicolas Goaziou wrote: > Hello, > > Roland Coeurjoly writes: > > > From 091f470a278561a60fac1ee3ee658f6823bc2503 Mon Sep 17 00:00:00 2001 > > From: Roland Coeurjoly > > Date: Sat, 25 Apr 2020 20:35:22 +0200 > > Subject: [PATCH] Add Haskell specific header argument compile, to compi= le > > instead of interpret the body of source block > > Thank you! > > Could you rewrite the commit message so that it is on par with our > conventions? > > It could be something like: > > ob-haskell: introduce :compile header argument > > * lisp/ob-haskell (org-babel-haskell-compiler): > (org-babel-header-args:haskell): new variables. > (org-babel-haskell-execute): > (org-babel-haskell-interpret): new functions. > (org-babel-execute:haskell): use new functions. > > > -;; Org-Babel support for evaluating haskell source code. This one wil= l > > -;; be sort of tricky because haskell programs must be compiled before > > +;; Org-Babel support for evaluating Haskell source code. > > +;; Haskell programs must be compiled before > > "Org Babel" would be even better, while you're changing this line. > > > +(defcustom org-babel-Haskell-compiler "ghc" > > No need to capitalize Haskell here. > > > + "Command used to compile a Haskell source code file into an > executable. > > +May be either a command in the path, like ghc > > like "ghc" > > > +or an absolute path name, like /usr/local/bin/ghc > > like "/usr/local/bin/ghc". > > > +parameter may be used, like ghc -v" > > The command can include a parameter, such as "ghc -v". > > > + :group 'org-babel > > + :version "27.0" > > It should be :package-version '(Org "9.4") instead. > > > + :type 'string) > > + > > +(defconst org-babel-header-args:haskell '((compile . :any)) > > + "Haskell-specific header arguments.") > > + > > +(defun org-babel-Haskell-execute (body params) > > + "This function should only be called by `org-babel-execute:haskell'" > > + (let* ((tmp-src-file (org-babel-temp-file > > + "Haskell-src-" > > + ".hs")) > > Indentation seems a bit off. > > > + (tmp-bin-file > > + (org-babel-process-file-name > > + (org-babel-temp-file "Haskell-bin-" org-babel-exeext))) > > + (cmdline (cdr (assq :cmdline params))) > > + (cmdline (if cmdline (concat " " cmdline) "")) > > + (flags (cdr (assq :flags params))) > > + (flags (mapconcat 'identity > > Nitpick: #'identity > > > + (if (listp flags) flags (list flags)) " ")) > > + (libs (org-babel-read > > + (or (cdr (assq :libs params)) > > + (org-entry-get nil "libs" t)) > > + nil)) > > Ditto, mind the indentation. > > > + (libs (mapconcat #'identity > > + (if (listp libs) libs (list libs)) > > + " "))) > > + (with-temp-file tmp-src-file (insert body)) > > + (org-babel-eval > > + (format "%s -o %s %s %s %s" > > + org-babel-Haskell-compiler > > + tmp-bin-file > > + flags > > + (org-babel-process-file-name tmp-src-file) > > + libs) "") > > Please move the empty string below. > > > + (let ((results > > + (org-babel-eval > > + (concat tmp-bin-file cmdline) ""))) > > + (when results > > + (setq results (org-trim (org-remove-indentation results))) > > + (org-babel-reassemble-table > > + (org-babel-result-cond (cdr (assq :result-params params)) > > + (org-babel-read results t) > > + (let ((tmp-file (org-babel-temp-file "Haskell-"))) > > + (with-temp-file tmp-file (insert results)) > > + (org-babel-import-elisp-from-file tmp-file))) > > + (org-babel-pick-name > > + (cdr (assq :colname-names params)) (cdr (assq :colnames params)= )) > > + (org-babel-pick-name > > + (cdr (assq :rowname-names params)) (cdr (assq :rownames > params))))) > > + ))) > > Please move the closing parens on the line above. > > + > > +(defun org-babel-interpret-Haskell (body params) > > Why capitalization in function names? > > > (require 'inf-haskell) > > (add-hook 'inferior-haskell-hook > > (lambda () > > @@ -96,6 +154,14 @@ org-babel-execute:haskell > > (org-babel-pick-name (cdr (assq :rowname-names params)) > > (cdr (assq :rowname-names params)))))) > > > > + > > +(defun org-babel-execute:haskell (body params) > > + "Execute a block of Haskell code." > > + (setq compile (string=3D (cdr (assq :compile params)) "yes")) > > Use a let-binding instead of setq. > > > Could you send an updated patch? > > Regards, > > -- > Nicolas Goaziou > --000000000000540fbd05a4d52d9d Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
I am confused about the last point:
Use a let-binding instead of setq.

If I use:
=

(let* compile (string=3D (cdr (assq :compile params)) &= quot;yes"))

I get the following error:
<= div>ob-haskell.el:158:1: Error: Wrong type argument: listp, compile

If I leave with set:
(setq compile (string=3D (= cdr (assq :compile params)) "yes"))
I get the following= warnings:
ob-haskell.el:161:12: Warning: assignment to free vari= able =E2=80=98compile=E2=80=99
ob-haskell.el:161:12: Warning: reference = to free variable =E2=80=98compile=E2=80=99

Upon se= arching the web, I find a relevant this relevant post, whose conclusion (if I under= stand it correctly) is that we could live with those warning raised by setq= .

Apart from this issue I am ready to submit a fix= ed patch.

What do you recommend?
On Mon, = May 4, 2020 at 5:26 PM Nicolas Goaziou <mail@nicolasgoaziou.fr> wrote:
Hello,

Roland Coeurjoly <rolandcoeurjoly@gmail.com> writes:

> From 091f470a278561a60fac1ee3ee658f6823bc2503 Mon Sep 17 00:00:00 2001=
> From: Roland Coeurjoly <rolandcoeurjoly@gmail.com>
> Date: Sat, 25 Apr 2020 20:35:22 +0200
> Subject: [PATCH] Add Haskell specific header argument compile, to comp= ile
>=C2=A0 instead of interpret the body of source block

Thank you!

Could you rewrite the commit message so that it is on par with our
conventions?

It could be something like:

=C2=A0 ob-haskell: introduce :compile header argument

=C2=A0 * lisp/ob-haskell (org-babel-haskell-compiler):
=C2=A0 (org-babel-header-args:haskell): new variables.
=C2=A0 (org-babel-haskell-execute):
=C2=A0 (org-babel-haskell-interpret): new functions.
=C2=A0 (org-babel-execute:haskell): use new functions.

> -;; Org-Babel support for evaluating haskell source code.=C2=A0 This o= ne will
> -;; be sort of tricky because haskell programs must be compiled before=
> +;; Org-Babel support for evaluating Haskell source code.
> +;; Haskell programs must be compiled before

"Org Babel" would be even better, while you're changing this = line.

> +(defcustom org-babel-Haskell-compiler "ghc"

No need to capitalize Haskell here.

> +=C2=A0 "Command used to compile a Haskell source code file into = an executable.
> +May be either a command in the path, like ghc

like "ghc"

> +or an absolute path name, like /usr/local/bin/ghc

like "/usr/local/bin/ghc".

> +parameter may be used, like ghc -v"

The command can include a parameter, such as "ghc -v".

> +=C2=A0 :group 'org-babel
> +=C2=A0 :version "27.0"

It should be :package-version '(Org "9.4") instead.

> +=C2=A0 :type 'string)
> +
> +(defconst org-babel-header-args:haskell '((compile . :any))
> +=C2=A0 "Haskell-specific header arguments.")
> +
> +(defun org-babel-Haskell-execute (body params)
> +=C2=A0 "This function should only be called by `org-babel-execut= e:haskell'"
> +=C2=A0 (let* ((tmp-src-file (org-babel-temp-file
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0"Haskell-src-"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 ".hs"))

Indentation seems a bit off.

> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(tmp-bin-file
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (org-babel-process-file-name
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(org-babel-temp-file "H= askell-bin-" org-babel-exeext)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(cmdline (cdr (assq :cmdline params= )))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(cmdline (if cmdline (concat "= " cmdline) ""))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(flags (cdr (assq :flags params)))<= br> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(flags (mapconcat 'identity

Nitpick: #'identity

> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 (if (listp flags) flags (list flags)) " "))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(libs (org-babel-read
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(or (cdr (assq :libs = params))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(org-en= try-get nil "libs" t))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nil))

Ditto, mind the indentation.

> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(libs (mapconcat #'identity
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0(if (listp libs) libs (list libs))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0" ")))
> +=C2=A0 =C2=A0 (with-temp-file tmp-src-file (insert body))
> +=C2=A0 =C2=A0 (org-babel-eval
> +=C2=A0 =C2=A0 =C2=A0(format "%s -o %s %s %s %s"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0org-babel-Haskell-com= piler
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 tmp-bin-file
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 flags
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (org-babel-process-file-name tmp-s= rc-file)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 libs) "")

Please move the empty string below.

> +=C2=A0 =C2=A0 (let ((results
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (org-babel-eval
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(concat tmp-bin-file cmdline) "= ;")))
> +=C2=A0 =C2=A0 =C2=A0 (when results
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (setq results (org-trim (org-remove-inden= tation results)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (org-babel-reassemble-table
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(org-babel-result-cond (cdr (assq := result-params params))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (org-babel-read results t)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (let ((tmp-file (org-babel-temp-file &quo= t;Haskell-")))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (with-temp-file tmp-file (insert r= esults))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (org-babel-import-elisp-from-file = tmp-file)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(org-babel-pick-name
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0(cdr (assq :colname-names params)) (cdr (a= ssq :colnames params)))
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(org-babel-pick-name
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0(cdr (assq :rowname-names params)) (cdr (a= ssq :rownames params)))))
> +=C2=A0 =C2=A0 =C2=A0 )))

Please move the closing parens on the line above.
> +
> +(defun org-babel-interpret-Haskell (body params)

Why capitalization in function names?

>=C2=A0 =C2=A0 (require 'inf-haskell)
>=C2=A0 =C2=A0 (add-hook 'inferior-haskell-hook
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (lambda ()
> @@ -96,6 +154,14 @@ org-babel-execute:haskell
>=C2=A0 =C2=A0 =C2=A0 =C2=A0(org-babel-pick-name (cdr (assq :rowname-nam= es params))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0(cdr (assq :rowname-names params))))))
>=C2=A0
> +
> +(defun org-babel-execute:haskell (body params)
> +=C2=A0 "Execute a block of Haskell code."
> +=C2=A0 (setq compile (string=3D (cdr (assq :compile params)) "ye= s"))

Use a let-binding instead of setq.


Could you send an updated patch?

Regards,

--
Nicolas Goaziou
--000000000000540fbd05a4d52d9d--