Posts tagged programming language
The official ::gentoo
repository currently contains only GHC on version 9.2.8. To install newer GHC one has to either download/build themselves or use the ::haskell
overlay (https://github.com/gentoo-haskell/gentoo-haskell).
Enable the ::haskell overlay
Enable:
|
eselect repository enable haskell
|
Sync:
|
emerge --sync haskell
egencache --update --repo haskell --jobs 12 --load 6
eix-update
|
Unmask needed packages
Add to /etc/portage/package.unmask/0000_hs.conf
|
<dev-lang/ghc-9.9
<dev-haskell/cabal-3.11
<dev-haskell/cabal-install-3.11
<dev-haskell/cabal-install-solver-3.11
<dev-haskell/cabal-syntax-3.11
<dev-haskell/text-2.2
<dev-haskell/parsec-3.1.18
|
Add to /etc/portage/package.accept_keywords/0000_hs.conf
|
app-admin/haskell-updater
dev-haskell/*
dev-lang/ghc
|
Install
|
emerge --ask --verbose ">=dev-lang/ghc-9.8" ">=dev-haskell/cabal-install-3.10"
|
Build of GHC 9.8 takes around ~2 hours on a 8-core laptop-grade CPU.
Bonus: masking packages from ::haskell
If you want to exclude a given version from the ::haskell
overly from being installed/updated, then you can add a similar line(s) to /etc/portage/package.mask/0000_hs.conf
:
|
app-emacs/haskell-mode::haskell
|
Equality methods
By implementing a method for equality equal-to?
and two extraction methods equal-hash-code-of
and equal-secondary-hash-code-of
we can define our own object comparison rules.
For more info see Object Equality and Hashing.
Consider the following example:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
|
If we create a new integer%
object we can notice that it is not transparent (we can not inspect values of any of it’s fields).
|
(new integer%)
;; => (object:integer% ...)
|
But if we compare two fresh integer%
objects they will be equal.
Transparent class
A transparent cvlass is a class with the inspect
expression valuye se to #false
.
From Racket documentation Creating Classes:
Just as for structure types, an inspector controls access to the class’s fields, including private fields, and also affects comparisons using equal?.
Consider the following example:
If we create a new integer%
object we can see it’s field values.
|
(new integer%)
;; => (object:integer% 0)
|
And if we compare two fresh integer%
objects they will be equal.
Intro
Instead of changing CSS style for Your Racket projects documentation, You may be interested in compiling Markdown files generated form Scribble source into HTML documentation website.
Creating MkDocs project
-
Create docs
directory and mkdocs.yml
config file in current directory, along with a dummy index.md
file in docs
folder.
-
Edit the name of the project.
Replace Racket-Project
with your project name.
|
---
site_name: Racket-Project
|
Building Scribble
Generate markdown files form scribble documentation.
Replace Racket-Project.scrbl
with path to your scribble documentation main source file.
|
scribble --markdown --dest ./docs --dest-name index.md Racket-Project.scrbl
|
Building Markdown
Compile HTML documentation from the markdown source.
HTML files should appear in the site
directory.
Running the server
Some features, like search for example are only available when running the mkdocs server.
Caveats
Some scribble functions do not look good or work correctly for markdown-to-HTML compilation by MkDocs.
Example configuration
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 |
site_name: Racket-Ebuild
site_author: xgqt@riseup.net
site_description: library to ease ebuild creation
site_url: https://gitlab.com/gentoo-racket/racket-ebuild
repo_name: gentoo-racket/racket-ebuild
repo_url: https://gitlab.com/gentoo-racket/racket-ebuild
plugins:
- search
theme:
name: material
extra:
social:
- icon: fontawesome/brands/gitlab
link: https://gitlab.com/gentoo-racket/racket-ebuild
|
Also see: Fast-Racket at Racket's GitHub Wiki
Creating binaries
You can create portable binaries with Racket's raco
command! Use raco exe
and raco distribute
.
More -> https://docs.racket-lang.org/raco/exe.html
Sample games
Racket provides a executable plt-games
, when ran (from console) it opens a menu of miscellaneous games, among them: jewel, minesweeper, aces, spider, checkers. & more (20 games total).
Plots
You can plot data in 2d & 3d forms.
2D
Sample code:
|
#lang racket/base
(require racket/gui/base racket/math plot)
(plot-new-window? #true)
(plot (function sin (- pi) pi #:label "y = sin(x)"))
|
3D
Sample code:
|
#lang racket/base
(require racket/gui/base racket/math plot)
(plot-new-window? #true)
(plot3d
(surface3d (lambda (x y) (* (cos x) (sin y)))
(- pi) pi (- pi) pi)
#:title "An R × R → R function"
#:x-label "x" #:y-label "y" #:z-label "cos(x) sin(y)")
|
Browser
There's a included library to render web pages, just "(require browser)".
Sample code:
|
#lang racket
(require browser)
(open-url "https://xgqt.gitlab.io/")
|
FFI
You can use Racket's Foreign Function Interface to interact with non-Racket libraries to make use of very fast libraries written in (mainly) FORTRAN & C.
For example sci uses FFI for CBLAS & LAPACK.
Parallelism
For greater speed up with parallel execution there are futures, places and distributed places (for distributed programming).