Giter VIP home page Giter VIP logo

haskell-mode's Introduction

Haskell Mode for Emacs

This is an Emacs mode for editing, developing and debugging Haskell programs. Home page.

Build Status Melpa Status Melpa Stable Status Non-GNU ELPA Status License GPL3

I just want to thank everybody involved in one way or another with the Haskell Emacs tooling. It is one of the best language experiences I had in Emacs. -- cocreature, 2015-03-01

I've been using it for a long time and love it. Great work on haskell-mode! Keep up the good work! -- LukeHoersten, 2015-04-02

This sounds wonderful. Does anything similar exist for Vim? -- earldouglas, 2015-07-02

Users manual: latest version, older versions: 13.12, 13.14, 13.16, 13.18, 13.20.

Quick Installation

Make sure you have this in your init file (usually ~/.emacs). If you already have custom-set-variables, merge its contents:

(require 'package)
(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(package-archives
   (quote
    (("gnu" . "https://elpa.gnu.org/packages/")
     ("melpa" . "https://melpa.org/packages/")))))
(package-initialize)

Then run emacs, and evaluate:

M-x package-refresh-contents

and then follow by

M-x package-install RET haskell-mode

Voilà! haskell-mode is installed! You should be able to edit Haskell source code in color now.

Haskell-mode has much much more to offer but the above should get you going!

Advanced configuration

For setup instructions, please consult the integrated haskell-mode Info manual which can be accessed after installation via M-x info-display-manual [RET] haskell-mode. Alternatively, you can also direct your browser to the the online haskell-mode manual for setup and user guide.

Installation - more information

haskell-mode supports GNU Emacs version 25.1 or later.

haskell-mode is available from MELPA Stable (releases) and MELPA (git snapshots). The latter will generally be considerably more up-to-date, and is recommended for most users.

Other means of obtaining haskell-mode include el-get, Emacs Prelude and Debian package.

Installation from git repository

Running haskell-mode directly from sources is easy but requires a little preparation:

  • git clone https://github.com/haskell/haskell-mode.git into a suitable directory, e.g. ~/lib/emacs/haskell-mode/ where ~ stands for your home directory.

  • Assuming you have unpacked the various haskell-mode modules (haskell-mode.el and the rest) in the directory ~/lib/emacs/haskell-mode/, you need to generate various files, the autoloads file (haskell-mode-autoloads.el) is one among them. Invoke:

make EMACS=/path/to/your/emacs

and then adding the following command to your .emacs:

(add-to-list 'load-path "~/lib/emacs/haskell-mode/")
(require 'haskell-mode-autoloads)
(add-to-list 'Info-default-directory-list "~/lib/emacs/haskell-mode/")

Installation from git repository on macOS

There are a couple of things to note if you want to install directly from git on macOS systems, as of version 10.13 High Sierra:

  • The version of makeinfo that is installed by default in /usr/bin is quite old and will cause the above make command to exit with an error. Installing the texinfo package using Homebrew will fix this. Be sure to follow the post-install instructions to add its bin directory to your shell's PATH variable.

  • If you are running an Emacs distribution packaged as a macOS application. such as the one available at https://emacsformacosx.com/, you'll need to add its executable to your PATH before the system's default Emacs version. That project's Tips and Tricks page has detailed instructions.

Contributing

If you followed the above you are just a couple of steps away from contributing to haskell-mode.

haskell-mode is actively seeking contributions from users of haskell-mode. For more information have a look at the wiki page on contributing.

haskell-mode's People

Contributors

bergey avatar chrisdone avatar cocreature avatar cydparser avatar czipperz avatar deepfire avatar dependabot[bot] avatar fanael avatar fice-t avatar fommil avatar geraldus avatar gracjan avatar gregorycollins avatar hvr avatar ikirill avatar ivan-m avatar jwiegley avatar k-bx avatar loveshack avatar lukehoersten avatar markus1189 avatar mrbliss avatar pheaver avatar philonous avatar purcell avatar ruediger avatar scvalex avatar sergv avatar vasanthaganeshk avatar vlatkob avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

haskell-mode's Issues

Correctly restarting the repl?

When I'm working on a project, and most typically, I add a module dependency to the cabal file, what's the correct way to reload the repl? I've been trying haskell-interactive-restart, as you might expect, but what I get instead is a disconnected repl, and this

This

when I quit.

What's the 'right way' to do it? :)

starting a process

When "starting a new project", the process window starts and grabs the focus, preventing me from answering the next question without touching the mouse (horrors!) to click on the dialog area at the bottom.

Also I think I should be "starting a session" or "loading a project", versus the current "starting a session".
Cheers.-T

Emacs 24 jump to compilation errors

Hello,

I have been using haskell-mode with emacs 23.* for quite some time. Great work!
Recently, I have upgraded emacs to version 24.1.1 and compilation error jumps seem to have stopped working.

For example, you're working on a haskell file, you do C-c C-l to load that file, and compilation errors (if any) will appear in the compilation buffer.
In emacs 23.*, you could hit RET on those compilation errors to jump to the appropriate file location.
This does not seem to work anymore.

If you need any more information, please let me know!

Cheers,
José

Cabal mode indents with tabs

I've found that cabal-mode for some reason insists on indenting with tabs, causing Cabal to complain. I'm a recently converted vim user, so it may be that there is nothing that can be done about this in haskell-mode. If this can't be fixed in haskell-mode, what is the recommended way to configure emacs to use spaces instead of tabs in cabal-mode?

Does haskell-process-load-file work in Emacs 24?

I've tried to run "haskell-process-load-file" and after answering some questions about starting a new project and current directory got a message "Invalid function: setf".

I wanted to use a new haskell-interactive-mode instead of inferior-haskell-mode, since the latter does not play very well with GHC 7.4.1: it is not possible to move between compilation errors, presumably because the messages format have been changed and old hardcoded regexes do not match anymore.

But alas, I am unable to run haskell-interactive-mode at all.

Function to completely and cleanly kill a haskell-interactive session

It would be nice to have a function that would completely destroy the currently active/loaded session on screen, removing all evidence of it ever having existed. If user tries to F5 on any of the previously associated files, a completely new session should start with a question asking for the cabal directory.

This would be particularly convenient when Emacs is loaded for extended periods of time - as it usually is - and the user wants to cleanly shut down (and perhaps later decide to restart) unattended Haskell sessions.

Please note that when the session is to be restarted, the process should really start from scratch and ask once again the cabal file and the working directory.

haskell-session-change bugs/breaks old session

I have run into the following problematic scenario a number of times:

  1. I start a project (F5) - all is working well - a project/session 'myapp' is created
  2. I navigate to a module under ./test, which has it's own cabal and taps into my actual app source tree, which is under ../src relative path. Example file : test/src/Main.hs
  3. I issue haskell-session-change for the newly opened module, which creates a new project called "myapp-testsuite" - all is working well here
  4. I edit some files under my actual project. Example: src/MyApp/ABC.hs
  5. I hit haskell-process-reload-file, which should issue the command hopefully to 'myapp' session. Instead, I get a message "nothing to save"
  6. If I hit F5, it asks to create a new project 'myapp', but that is already there.
  7. The 'myapp' session gets a reload message, but nothing really reloads. The 'myapp' session is now permanently bugged - I need to quit emacs and re-log to get it working again. Meanwhile, my messages buffer notes:

(No changes need to be saved) [2 times]
Start a new project named “myapp”? (y or n) y
setf: Wrong type argument: consp, nil [2 times]

tags question

Have I missed a simple way to get tags for all the modules my project depends on? Currently I manually generate them with hasktags and put them in the project tree. I don't bother with Prelude and other basic packages although sometimes I need to look up definitions from those as well.

haskell-process-generate-tags doesn't work in windows

(format ":!cd %s && %s | %s | %s"
                 (haskell-session-cabal-dir (haskell-process-session (car state)))
                 "find . -name '*.hs*'"
                 "grep -v '#'" ; To avoid Emacs back-up files. Yeah.
                 "xargs hasktags -e -x")))

I think you'd have to find another way to do that; grep, find, xargs aren't on windows--you might be able to use powershell commands instead.

ETA: This might help.

ETA2: The necessary powershell command is hasktags -e -x (ls -fi *.hs -exclude "#*" -name -r). I don't know elisp or how :!cd works, but from powershell you'd need to do cd %s ; %s

TAB not expanding in interactive ghci?

I tried emacs --load examples/init.el and everything works, except for one thing: when I hit TAB on an error message in the interactive buffer, it just inserts a tab. Even though the keymap is getting loaded, it looks like tab is still only bound to (indent-for-tab-command). Everything else works fine as far as I can tell.

I'm using GNU Emacs 23.3.1 in a terminal emulator (over ssh) in case that matters.

haskell-session-set: Invalid function: setf

I've pulled recent version from github, run make compile and when loading new project (I'm using new interactive mode) I get haskell-session-set: Invalid function: setf in messages buffer and project could not be loaded.
I use GNU Emacs 23.2.1 on Ubuntu Natty
Currently I've added (require 'cl) to haskell-session.el and it works but I have little elisp experience so I'm not sure that it's the proper solution for this problem.

haskell-mode-stylish-buffer errors out

When running (haskell-mode-stylish-buffer), it doesn't actually run or reformat my buffer. Instead it prints let: Symbol's value as variable is void: haskell-session to the *Messages* buffer.

auto-fill-mode is not working properly with literate-haskell-mode.

in http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=570236

Marco Túlio Gontijo e Silva writes:

If I have a big line, like:

If set to yes then the package management system will refuse to remove the package (upgrading and replacing it is still possible). The other possible value is no, which is the same as not having the field at all.$

And I press at the end of the line, I get:

If set to yes then the package management system will refuse to remove the $
package (upgrading and replacing it is still possible). The other possible value is no, which is the same as not having the field at all. $

Where I wanted:

If set to yes then the package management system will refuse to remove the
package (upgrading and replacing it is still possible). The other possible
value is no, which is the same as not having the field at all.

(I've added a $ in the end of the lines).

This is with turn-on-haskell-indentation in 2.8.0

'Enter' on lines above prompt breaks history in new interactive mode

When I hit 'enter' on lines other than the line with prompt I get some errors and in history I get some strange multiline block after showing which history toggling stops working (looks like it has something to do with newlines in history element)
And If I have in buffer:

λ> '1'
'1'

λ> 

And press 'enter' on the 2nd line I get -

haskell-interactive-mode-input: Args out of range: "

", 3, 2

Indentation of non-parallel list comprehensions is wrong.

forwarding http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=343248
Daniel Burrows writes:

haskell-mode indents parallel list comprehensions (the GHC extension)
just fine, but it seems to have trouble with non-parallel ones. For
instance, consider this code fragment:

allCards :: CardUniverse -> [CardValue]
allCards (CardUniverse s free) = free ++ suited
    where suited = [cv | suit <- s,
                         (cv, _) <- elems (suitCards suit)]

haskell-mode wants me to indent the last line to either the level of
"s" or the level of "cv" in the previous line; for instance:

-- | Returns a list of all the cards in the universe; this will be a
-- set if the universe is well-formed.
allCards :: CardUniverse -> [CardValue]
allCards (CardUniverse s free) = free ++ suited
    where suited = [cv | suit <- s,
                    (cv, _) <- elems (suitCards suit)]

I verified that this behaviour still exists with 2.8.0 and turn-on-haskell-indentation

'haskell-process-load-file doesn't reload project dependencies

I got the following error calling 'haskell-process-load-file:

Related.hs:14:18: Could not find module `Data.ByteString.Lazy': …
    It is a member of the hidden package `bytestring-0.9.1.10'.
    Perhaps you need to add `bytestring' to the build-depends in your .cabal file.
    Use -v to see a list of the files searched for.
Compilation failed.

I added the dependency to the .cabal file as suggested. Then,

  • Calling 'haskell-process-cabal-build could compiled
  • Calling 'haskell-process-load-file could not compile

Opening a new emacs instance and Related.hs, doing 'haskell-process-cabal-build, loads the file as expected.

haskell-process-load-file doesn't show compilation errors

haskell-process-cabal-build does show compilation errors, but when using haskell-process-load-file I only get a message showing "Compilation failed" in the REPL. The errors are, however, shown in the haskell-process-log buffer. This is on Windows.

Bring up help when trying to indent on a fresh install

Because there's no default indentation mode (kinda weird but), it'd be nice to bring up the documentation for the indentation modes when the user first tries to indent.

I popped some docs based on the existing docs with a bit more help, into the docstring of an Elisp variable, then based on that you can bring up the describe-variable buffer by default.

Seems like it's helpful to the newbies to Emacs and even the advanced users wouldn't mind. :-)

I can only make one merge request at a time so here's a ticket with some commit references.

Arrows in type signatures don't align under ::

I'd prefer if arrows aligned under the :: in type signatures, like so:

f :: a
  -> b

Right now we get

f :: a
    -> b

I don't know how much extra time I spend realigning things when coding. Perhaps this could be made an option if everyone can't agree on the style here?

Integrate haskell-interactive-mode errors with Emacs' next-error support framework

It might be beneficial for some user setups to get Emacs compiler error system working with haskell-interactive-mode errors.

As an example, here is what I have in my global config file:

(global-set-key (kbd "C-,") 'previous-error)
(global-set-key (kbd "C-.") 'next-error)

These commands also work for grep and occur results and easy to reach keys such as these make it very easy to navigate the them.

Additionally, it would be good to have these commands work from within the Haskell files (and not necessarily exclusively inside the interactive session). With that, the user workflow would be:

  • Compile file
  • Hit next-error
  • Fix error
  • Hit next-error
  • Fix error
  • Recompile
  • ...

without a need to even touch the ghci session in between.

key bindings in interactive haskell

In Interactive-Haskell mode, default key bindings for previous commands would be nice. I use Alt-up and Alt-dn. Can do a pul request if you prefer.

*haskell* jumping working directory to parent on exit

Subject: haskell jumping working directory to parent on exit
From: Per Fredelius [email protected]
To: [email protected]

I have the following issue: If I do this:

  1. Load up a module Test.Test using C-c C-l
  2. Close the ghci session using ':q'
  3. Try open a new session using C-c C-l without closing the haskell buffer.

Then ghci will give me an error, the module can not be found. Using
getCurrentDirectory (in System.Directory) will tell me why. Current
directory has been switched from previous session. It is now in the
previous directories parent directory. So if my testmodule has path
parentfolder/myfolder/Test/Test.hs the working directory will become
parentfolder/myfolder the first time and parentfolder the second time.

If I do close the buffer in between sessions the issue does not occur.

A friend suggested that haskell mode will look for cabal files and
sometimes change directory to one having one. I've tried moving my
cabal file around to no avail.

I'm still an emacs newbie so I may have confused some things up. I'm
not sure what happens, only the end result. This issue is mainly an
actual issue for me because of modules that cause ghci to crash when
closing them because of 'misbehaving' non-haskell dependencies
(opengl). Debugging would be much less of a hassle if I can trust in
C-c C-l.

Thanks in advance

inferior-haskell-find-haddock uses wrong URL

I tried to use the C-c C-d command to pop up the documentation for the function randomRIO, but unfortunately Emacs tried to reach it under the following (incorrect) URL:

http://www.haskell.org/ghc/docs/latest/html/libraries//%60System-Random%27.html#v:randomRIO

It looks like haskell-mode doesn't parse the output from ghc-pkg correctly? Is that maybe because I'm using ghc 7.4.1?

putStr breaks new interactive mode

Playing around I used putStr to output some string variable and it happens that when you do it REPL gets broken. Looks like it has something to do with prompt staying on the same line as the last line of output.

“Warning: Function `values' from cl package called at runtime” in Emacs 23.3.1

The titled message pops up in an annoying buffer when Emacs starts. It is due to this code:

(eval-when-compile
  ;; Emacs 21 defines `values' as a (run-time) alias for list.
  ;; Don't maerge this with the pervious clause.
  (if (string-match "values"
                    (pp (byte-compile (lambda () (values t)))))
      (defsubst values (&rest values)
        values)))

haskell-interactive-bring should split windows vertically

When I load a cabal file and hit C-c C-c to build the cabal project, my screen is split vertically just as it gets split when I use the standard Emacs M-x compile command.

However, when the compile fails and I hit enter on the error message in the interactive shell, the screen gets split horizontally. This happens even when I already have .hs file and the interactive windows both open in a vertical split configuration.

I think the problem is in haskell-interactive-bring. I see that it splits windows horizontally.

However, it seems to me that the code actually tries to avoid splitting in case the current window configuration is already split such that there's a source file and an interactive window already active. I think the find-if search somehow fails to detect this configuration.

So two things: 1) correctly detect the window configuration and don't split if the config is already ok and 2) split vertically if a split needs to be done.

PS. The new interactive stuff w/ cabal-dev is great! I've been looking for this for quite some time.

;;;###autoload
(defun haskell-interactive-bring ()
  "Bring up the interactive mode for this session."
  (interactive)
  (let ((session (haskell-session)))
    (let ((buffer (haskell-session-interactive-buffer session)))
      (unless (and (find-if (lambda (window) (equal (window-buffer window) buffer))
                            (window-list))
                   (= 2 (length (window-list))))
        (delete-other-windows)
        (split-window-horizontally)
        (switch-to-buffer-other-window buffer)
        (other-window 1)))))

Edit: More specific repro steps:

  1. Open file foo.hs (which is part of a foo.cabal project)
  2. C-c C-c
  3. Answer the usual questions in minibuffer relating to setting up the project, the screen is split vertically and I see the interactive shell
  4. Insert an error into foo.hs, save and hit C-c C-c again
  5. See the error in the interactive haskell window
  6. Find the error and hit enter on top of it
  7. The screen is split horizontally even though the expected behavior would be to retain the existing split window configuration.

I'm trying to debug the Elisp code to understand why this happens.

add arguments for ghci command line

I need to pass command line arguments to ghci to load shared lib: -Llib -lpdf
it would be great to setup ghci arguments per project.

Unfortunately i cannot set them up via .ghci file. For some reason they do not work like that. Only from command line.

Imports statements begin life indented

This might just be my incompetence in configuring emacs but for some reason new lines opened after an import statement (e.g. to insert another import) begin as indented, generally aligned to the beginning of the module name of the previous line. It's unclear why this happens as your configuration (as seen in your Youtube tutorial) doesn't seem to do this. I am using the simple indentation method as seen in your init.el,

(defun haskell-hook ()
;; Use simple indentation.
(turn-on-haskell-simple-indent)
(define-key haskell-mode-map (kbd "<return>") 'haskell-simple-indent-newline-same-col)
(define-key haskell-mode-map (kbd "C-<return>") 'haskell-simple-indent-newline-indent)
)

Create project with different cabal-dev location

Is it currently possible to point a project/session to a cabal-dev directory that is different to that which contains the project.cabal file? (And is it even a good idea to do this)

I'm hacking on a project (distributed-process) which contains multiple dependent projects in the same tree:

tree -L 1 ..
..
├── benchmarks
├── cabal-dev
├── distributed-process
├── doc
├── examples
├── install_all.sh
├── network-transport
├── network-transport-pipes
├── network-transport-zmq
└── README.md

My project is network-transport-zmq which contains the .cabal file but I'd like to use the cabal-dev in the parent directory.

  1. Can I do it?
  2. Should I do it?

can't invoke without moving around

When emacs comes up I can't invoke (via key mappings of course) haskell-process-bring or haskell-process-load-file without moving around in the file first. Not a big issue but disconcerting for a new user.

Backspace character in haskell-interactive-mode

QuickCheck uses backspace characters to make nice output while it is running tests. This does not work in haskell-interactive-mode:

λ> import Test.QuickCheck

λ> quickCheck (\xs -> reverse (reverse xs) == xs)
(0 tests)���������^H^H^H^H^H^H^H^H^H         ���������^H^H^H^H^H^H^H^H^H(1 test) [etc.]

I think the old inferior-haskell mode handles this properly, but I'm not sure how to fix it in the new interactive mode.

Debugger support

I'd like to see haskell-mode support better integration with the ghci debugger -- mode key bindings for stepping, tracing, printing, etc, and highlighting of the current source location in the source buffer.

Syntax highlighting wrong in listish type signature or top-level pattern matching.

Hello.

When writing something like:

bleh, bluh  Blah
[bleh,bluh] = map blahfication [e,u]

blih :: Blah

bleh and bluh appeir in normal font-face in haskell mode, while one would expect them to appeair highlighted like blih is. The "comma-separated multiple type signature" case should definetely be highlighted. I admit that the "pattern matching at top-level" is more tricky…

Just call the package "emacs"

I'll make this ticket once and I won't complain about it again. Some points:

  • Why not just https://github.com/haskell/emacs?
  • If we make a vim package it'll be https://github.com/haskell/vim, no? Not haskell-mode or haskell-vm or whatever.
  • All the other projects on that page aren't redundantly prefixed with “haskell-”. We don't have a problem talking about them, so why not just call the package “emacs”?
  • The name implies it's only a mode when in fact it has (and will have) much more.
  • Moving its location is a chance to change this name before the search engines and interwebs catch up.

That's all. If you don't agree I don't care to argue the case, more interested in hacking, just thought I'd try.

unable to save sessions

I open a haskell project with a cabal file and use the f5 bind supplied in the examples dir. A prompt asks me to start a new project and so on. I do this and everything is working as expected, but on restarting emacs I have go through this prompt process again.

I'm using Windows 8 with Emacs 24 and the latest haskell-mode.

haskell-process-do-type adds parens

haskell-process-do-type adds parenthesis around alpha-numeric names and inserts them when used with a prefix argument.

For example it will insert the type signature

(foo) :: t -> t

for the function

foo x = x

string chokes something

This example

help _ _ _ = putStrLn $
          " wheel up  --> next image\n\
          \ up arrow  --> next image\n\
          \ wheel dn  --> prev image\n\
          \ r arrow   --> next field\n\
          \ l arrow   --> prev field\n\
          \ \"x\"     --> del format\n\
          \ \"f\"     --> new format\n\
          \ \"n\"     --> new field\n\
          \ \"d\"     --> del field\n\
          \ 1-5       --> set field name\n\
          \ click     --> set upper left\n\
          \ r-click   --> set lower right\n\
          \ ctl-click --> set lower right\n\
          \ w         --> write file\n\
          \ p         --> print file to screen"

yields the error

lisp-nesting exceeds `max-lisp-eval-depth'

To be fair it breaks the old haskell mode too, so feel kick it into touch.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.