<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On 13 November 2017 at 03:47, Ben Gamari <span dir="ltr"><<a href="mailto:ben@smart-cactus.org" target="_blank">ben@smart-cactus.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">Harendra Kumar <<a href="mailto:harendra.kumar@gmail.com">harendra.kumar@gmail.com</a>> writes:<br>
<br>
> On 12 November 2017 at 23:18, Ben Gamari <<a href="mailto:ben@smart-cactus.org">ben@smart-cactus.org</a>> wrote:<br>
><br>
</span><span class="">>> In general it's not easy to get a reference to a an arbitrary function<br>
>> in an object file by it's source name. Unless the symbol is exported the<br>
>> compiler is free to optimize the function or even drop it altogether.<br>
>><br>
><br>
> I understand that. I was also wondering if there is way (some sort of<br>
> annotation, pragma or any other workaround) to keep the symbols around<br>
> without actually exporting them.  Exporting either clobbers the module<br>
> interface from user point of view or the modules need a wrapper to avoid<br>
> exporting such symbols in user exposed modules. I would also expect an<br>
> option to remove the effect of any such annotation so that the production<br>
> build is not under optimized because of this. This is in fact one of the<br>
> problems that I have been facing in general. I do not know of a good way to<br>
> hide symbols from users but use them in tests and benchmarks during dev.<br>
> What is the GHC recommended way to achieve this?<br>
><br>
</span>The usual way of dealing with this is to expose the symbols from a<br>
`.Internal` module.<br></blockquote><div><br></div><div>That's what I meant when I referred to a wrapper module above. However, it requires you to create two modules even if one extra symbol is needed for dev purposes, a lot of boilerplate for a simple thing. Also, the symbols are anyway exposed to the users, we just ask the users to not look at those. I am wondering if using a preprocessor (CPP) conditional around the optional exports is a better way then, you will have to build differently but you won't have to create another module and expose extra symbols?</div><div><br></div><div>-harendra</div></div></div></div>