with-c-syntax

2018-12-10

??

with-c-syntax ?? Common Lisp ? C ????????????????? ???????????????????????????

??? C ??????????? ISO C 90 ? freestanding ?????? ??????????????

Abstract

with-c-syntax is a fun package which introduces the C language syntax into Common Lisp. (Yes, this package is not for practical coding, I think.)

At this stage, this package has almost all features of ISO C 90 freestanding implementation. (The lacking part is the full implementation of the C Preprocessor.)

Loading

Libraries depending on

  • asdf
  • cl-yacc
  • alexandria
  • named-readtables

Load with ASDF

(load "with-c-syntax.asd")
(asdf:load-system :with-c-syntax)

Running tests

(load "with-c-syntax-test.asd")
(asdf:test-system :with-c-syntax)

Examples

Hello, World

CL-USER> (with-c-syntax:with-c-syntax ()
    format \( t \, "Hello World!" \) \;
  )

Hello World!
NIL

For suppressing Lisp's syntax, you need many backshash escapes.

#{ and }# reader macro escapes them and wrap its contents into with-c-syntax. You can use it to write simply:

;; enables #{ }# reader macros.
CL-USER> (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)
...

CL-USER> #{ format (t, "Hello World!"); }#

Hello World!
NIL

This example shows you can call a Lisp function (cl:format) with C syntax.

Summing from 1 to 100.

  (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)

  #{
    int i, sum = 0;

    for (i = 0; i <= 100; ++ i )
      sum += i;
    return sum;
  }#
  ;; => 5050

Uses C syntax inside a Lisp function.

  (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)

  (defun array-transpose (arr)
    (destructuring-bind (i-max j-max) (array-dimensions arr)
      #{
        int i,j,temp;
        for (i = 0; i < i-max; i ++) {
            for (j = i + 1; j < j-max; j ++) {
                temp = arr[i][j];
                arr[i][j] = arr[j][i];
                arr[j][i] = temp;
                // pprint (arr) ;
            }
        }
      }#)
    arr)

  (array-transpose (make-array '(3 3)
        :initial-contents '((0 1 2) (3 4 5) (6 7 8))))
  ; => #2A((0 3 6) (1 4 7) (2 5 8))

Defines a function with C syntax.

  (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)

  #{
  int sum-of-list (list) {
    int list-length = length(list);
    int i, ret = 0;

    for (i = 0; i < list-length; ++ i) {
       ret += nth(i, list);
    }

    return ret;
  }
  }#

  (sum-of-list '(1 2 3 4 5 6 7 8 9 10)) ; => 55

Duff's Device

  (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)

  (defun w-c-s-duff-device (to-seq from-seq cnt)
      #{
      int * to = & to-seq;
      int * from = & from-seq;

      int n = (cnt + 7) / 8;
      n = floor(n);           /* Lisp's CL:/ produces rational */
      switch (cnt % 8) {
      case 0 :    do {    * to ++ = * from ++;
      case 7 :            * to ++ = * from ++;
      case 6 :            * to ++ = * from ++;
      case 5 :            * to ++ = * from ++;
      case 4 :            * to ++ = * from ++;
      case 3 :            * to ++ = * from ++;
      case 2 :            * to ++ = * from ++;
      case 1 :            * to ++ = * from ++;
        } while (-- n > 0);
      }
      }#
    to-seq)

  (setf arr1 (make-array 20 :initial-element 1))
  (setf arr2 (make-array 20 :initial-element 2))
  (w-c-s-duff-device arr1 arr2 10)

  arr1 ;; => #(2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1)

API

Please see these docstrings or comments:

  • Macro with-c-syntax

  • defreadtable of with-c-syntax-readtable
  • Variable *with-c-syntax-reader-level*
  • Variable *with-c-syntax-reader-case*

License

Copyright (c) 2014 YOKOTA Yuki <y2q.actionman@gmail.com>

This program is free software. It comes without any warranty, to the extent permitted by applicable law. You can redistribute it and/or modify it under the terms of the Do What The Fuck You Want To Public License, Version 2, as published by Sam Hocevar. See the COPYING file for more details.

Further Information

Please see: https://github.com/y2q-actionman/with-c-syntax/wiki

Author
YOKOTA Yuki <y2q.actionman@gmail.com>
License
WTFPL