{"id":13442529,"url":"https://github.com/y2q-actionman/with-c-syntax","last_synced_at":"2026-01-14T15:02:57.527Z","repository":{"id":18978425,"uuid":"22199631","full_name":"y2q-actionman/with-c-syntax","owner":"y2q-actionman","description":"C language syntax in Common Lisp","archived":false,"fork":false,"pushed_at":"2022-11-08T06:03:33.000Z","size":1062,"stargazers_count":149,"open_issues_count":3,"forks_count":7,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-03-20T14:41:05.416Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Common Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"wtfpl","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/y2q-actionman.png","metadata":{"files":{"readme":"README.org","changelog":null,"contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-07-24T05:01:53.000Z","updated_at":"2025-02-26T12:22:09.000Z","dependencies_parsed_at":"2023-01-11T20:30:26.356Z","dependency_job_id":null,"html_url":"https://github.com/y2q-actionman/with-c-syntax","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/y2q-actionman/with-c-syntax","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/y2q-actionman%2Fwith-c-syntax","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/y2q-actionman%2Fwith-c-syntax/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/y2q-actionman%2Fwith-c-syntax/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/y2q-actionman%2Fwith-c-syntax/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/y2q-actionman","download_url":"https://codeload.github.com/y2q-actionman/with-c-syntax/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/y2q-actionman%2Fwith-c-syntax/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28424040,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T13:30:50.153Z","status":"ssl_error","status_checked_at":"2026-01-14T13:29:08.907Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T03:01:46.868Z","updated_at":"2026-01-14T15:02:57.497Z","avatar_url":"https://github.com/y2q-actionman.png","language":"Common Lisp","readme":"# -*- mode: org; coding: utf-8; -*-\n\n* Abstract\n*with-c-syntax* is a fun package which introduces the C language\nsyntax into Common Lisp. (Yes, this package is not for practical\ncoding, I think.)\n\nAt this stage, this package has all features of ISO C 90 freestanding\nimplementation.\n\n* News\n\n- (2022-10-9) New extensions, [[#statement-expression][Statement Expression]] and [[#support-with--like-macros][with- like syntax support]] were added.\n- (2021-9-5) C Preprocessor is added. See [[#c-preprocessor][C preprocessor examples]].\n- (2021-5-24) C Numeric Literals are added. See [[#inline-usage][examples in 'inline usage' section]]. (Inspired by [[https://github.com/akanouras][@akanouras]] at [[https://github.com/y2q-actionman/with-c-syntax/pull/7][PR #7]].)\n- (2019-4-25) Some special handlings around =++=, =*=, etc are added. See [[#duffs-device][Duff's Device example]] .\n- (2019-4-25) Added a new example, [[#c-in-lisp-in-c-in-lisp][C in Lisp in C in Lisp]].\n\n* Examples\n** Hello, World\n\n#+BEGIN_SRC lisp\nCL-USER\u003e (with-c-syntax:with-c-syntax ()\n    format \\( t \\, \"Hello World!\" \\) \\;\n  )\n\nHello World!\nNIL\n#+END_SRC\n\nFor suppressing Lisp's syntax, you need many backslash escapes.\n\n~#{~ and ~}#~ reader macro escapes them and wrap its contents\ninto ~with-c-syntax~.  You can use it to write simply:\n\n#+BEGIN_SRC lisp\n;; enables #{ }# reader macros.\nCL-USER\u003e (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)\n...\n\nCL-USER\u003e #{ format (t, \"Hello World!\"); }#\n\nHello World!\nNIL\n#+END_SRC\n\nThis example shows you can call a Lisp function (~cl:format~) with C syntax.\n\n** Inline usage.\n\n   This macro can be used like a normal lisp expression. You can use\n   it whenever C-like syntax is wanted.\n\n   #+begin_src lisp\n     (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)\n\n     (assert (= 100 #{ 98 - 76 + 54 + 3 + 21 }#)) ; =\u003e T\n\n     ;;; Reader macro parameter '2' means to split C operators even inside Lisp symbols.\n     (assert #2{ 1+2+3-4+5+6+78+9 == 100 }#) ; =\u003e T\n   #+end_src\n\n   Because this macro supports C numeric literals, Using hexadecimal\n   floating number syntax may be a only practical feature of this\n   package.\n\n   #+begin_src lisp\n     (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)\n\n     (princ #{ 0x1.fffp+1 }#)\n     ;; =\u003e 3.99951171875d0\n   #+end_src\n   \n** Summing from 1 to 100.\n\n#+BEGIN_SRC lisp\n  (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)\n\n  #{\n    int i, sum = 0;\n  \n    for (i = 0; i \u003c= 100; ++i)\n      sum += i;\n    return sum;\n  }#\n  ;; =\u003e 5050\n#+END_SRC\n\n** Using C syntax inside a Lisp function.\n\n#+BEGIN_SRC lisp\n  (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)\n\n  (defun array-transpose (arr)\n    (destructuring-bind (i-max j-max) (array-dimensions arr)\n      #{\n        int i,j;\n        for (i = 0; i \u003c i-max; i++) {\n            for (j = i + 1; j \u003c j-max; j++) {\n\t        rotatef(arr[i][j], arr[j][i]);\n            }\n        }\n      }#)\n    arr)\n\n  (array-transpose (make-array '(3 3)\n \t\t:initial-contents '((0 1 2) (3 4 5) (6 7 8))))\n  ; =\u003e #2A((0 3 6) (1 4 7) (2 5 8))\n#+END_SRC\n\n** Defining a function with C syntax.\n\n#+BEGIN_SRC lisp\n  (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)\n\n  #{\n  int sum-of-list (list) {\n    int list-length = length(list);\n    int i, ret = 0;\n\n    for (i = 0; i \u003c list-length; ++i) {\n       ret += nth(i, list);\n    }\n\n    return ret;\n  }\n  }#\n\n  (sum-of-list '(1 2 3 4 5 6 7 8 9 10)) ; =\u003e 55\n#+END_SRC\n\n** Duff's Device\n#+BEGIN_SRC lisp\n  (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)\n\n  (defun wcs-duff-device (to-seq from-seq cnt)\n      #{\n      int *to = \u0026to-seq;\n      int *from = \u0026from-seq;\n\n      int n = floor ((cnt + 7) / 8);\t/* Use floor(), because Lisp's '/' produces rational */\n      switch (cnt % 8) {\n      case 0 :    do {    *to++ = *from++;\n      case 7 :            *to++ = *from++;\n      case 6 :            *to++ = *from++;\n      case 5 :            *to++ = *from++;\n      case 4 :            *to++ = *from++;\n      case 3 :            *to++ = *from++;\n      case 2 :            *to++ = *from++;\n      case 1 :            *to++ = *from++;\n\t} while (--n \u003e 0);\n      }\n      }#\n    to-seq)\n\n  (defparameter *array-1*\n    (make-array 20 :initial-element 1))\n\n  ;; C syntax can also be used for defining a variable.\n  #{\n  int *array-2* [] = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};\n  }#\n\n  (wcs-duff-device *array-1* *array-2* 10)\n  (print *array-1*) ;; =\u003e #(2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1)\n#+END_SRC\n\nThis example shows some C operators (=++=, =--=, unary =*= and =\u0026=)\nbehave as you expected as possible.\n\n(This feature is based on [[https://github.com/phoe][@phoe]]'s suggestion. See [[https://github.com/y2q-actionman/with-c-syntax/issues/2][Issue #2]] .)\n\n** C in Lisp in C in Lisp\nSometimes you want to use the Lisp syntax even in =with-c-syntax=.\nIf you feel so, you can use =`= as an escape. Here is an example:\n# Let's see the unholy mixture..\n\n#+BEGIN_SRC lisp\n(named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)\n\n#{\nvoid 99-bottles-of-beer (filename) {\n  void * output-path = merge-pathnames (filename, user-homedir-pathname());\n  `(with-open-file (*standard-output* output-path :direction :output\n\t\t\t\t      :if-exists :supersede :if-does-not-exist :create)\n     #{\n     int b;\n     for (b = 99; b \u003e= 0; b--) {\n         switch (b) {\n         case 0 :\n           write-line(\"No more bottles of beer on the wall, no more bottles of beer.\");\n           write-line(\"Go to the store and buy some more, 99 bottles of beer on the wall.\");\n           break;\n         case 1 :\n           write-line(\"1 bottle of beer on the wall, 1 bottle of beer.\");\n           write-line(\"Take one down and pass it around, no more bottles of beer on the wall.\");\n           break;\n         default :\n           format(t, \"~D bottles of beer on the wall, ~D bottles of beer.~%\", b, b);      \n           format(t, \"Take one down and pass it around, ~D ~A of beer on the wall.~%\"\n                     , b - 1\n                     , ((b - 1) \u003e 1)? \"bottles\" : \"bottle\");\n           break;\n         }\n     }\n     }#);\n  return;\n  }\n}#\n\n(99-bottles-of-beer \"99_bottles_of_beer.txt\")\n\n(probe-file \"~/99_bottles_of_beer.txt\") ; =\u003e T\n#+END_SRC\n\nThis example creates \"99_bottles_of_beer.txt\" file into your home directory.\nI used =`= for using =with-open-file= in Lisp syntax.\n\nRecently, I added a syntax extension for these ~with-~ like macros. See below.\n# TODO: add a link.\n\n** Syntax extensions\n\n*** Statement Expression\n\nYou can treat any statements as a expression by surrounding =(= and =)=.\nThis is derived from [[https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html][GCC]].\n\n#+begin_src common-lisp\n  #{\n  int z = ({\n\t   int x = 1, y = 2;\n\t   return x + y;\n\t   });\n  return z;\n  }#   ; =\u003e 3\n#+end_src\n\n*** Support ~with-~ like macros.\n\n# (You can use any Lisp operators including =with-open-file= in =with-c-syntax= style.\n# However it looks very weird; [[https://github.com/y2q-actionman/with-c-syntax/blob/e3e9ae2f1f29115f30141e3ada33372e2ce6b65d/test/libc_string.lisp#L143][An example exists in my test code]].)\n\n=with-c-syntax= has a syntax extensiton for ~with-~ like macros:\n\n#+begin_example\nidentifier lisp-expression statement;\n#+end_example\u003e\n\nThis is compiled to a Lisp form like below:\n\n#+begin_example\n(identifier (\u003ccontents in lisp-expression\u003e ...)\n  \u003ccontents in statement\u003e\n  ...)\n#+end_example\n\n(This feature is based on [[https://github.com/phoe][@phoe]]'s suggestion. See [[https://github.com/y2q-actionman/with-c-syntax/issues/4][Issue #4]] .)\n\nHere are some examples:\n\n**** =with-slots=\n\n#+begin_src common-lisp\n  (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)\n\n  (defclass foo ()\n    ((slot1 :initform 1)\n     (slot2 :initform 2)))\n\n  #{\n  int test-with-slots (void) {\n    auto obj = make-instance (`'foo);\n  \n    with-slots `((slot1 slot2) obj) {\n      return slot1 + slot2 ;\n    }\n  }\n  }#\n\n  (test-with-slots) ; =\u003e 3\n#+end_src\n\n**** =with-output-to-string= and statement expression\n\nYou can take the value of =with-= syntax statement by wrapping it with =()=.\n\n#+begin_src common-lisp\n  (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)\n\n  #{\n  char * hello-world-string (void) {\n    return (with-output-to-string `((*standard-output*))\n\t     {\n\t     princ(\"Hello, World!\");\n\t     });\n  }\n  }#\n\n  (hello-world-string) ; =\u003e \"Hello, World!\"\n#+end_src\n\n**** Using with an operator takes a function\n\nThis syntax can currently apply to functions, not only macros.\nIt may be useful when the function takes a function at the last argument:\n\n#+begin_src common-lisp\n  (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)\n\n  #{\n  sort-ascending (lis) {\n    return (sort `(lis) `(lambda (x y)\n\t\t\t   #{\n\t\t\t   return x \u003c y;\n\t\t\t   }#);\n\t\t );\n  }\n  }#\n\n  (sort-ascending (list 2 4 1 5 3)) ; =\u003e (1 2 3 4 5)\n#+end_src\n\n** C Preprocessor\n\n*** C Macros\n\n=#define= can be used. This is a well-known MAX macro example.\n\n#+begin_src lisp\n  (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)\n\n  #{\n  #define MY_MAX(x, y) ((x)\u003e(y) ? (x) : (y))\n\n  int my-max-test (x, y) {\n  return MY_MAX (x, y);\n  }\n  }#\n\n  (my-max-test -1 1) ; =\u003e 1\n#+end_src\n\nBut you know Common Lisp already has [[http://www.lispworks.com/documentation/HyperSpec/Body/f_max_m.htm][CL:MAX]]. We can use it directly:\n    \n#+begin_src lisp\n  (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)\n\n  #{\n  #define MY_CL_MAX(x, ...) cl:max(x, __VA_ARGS__)\n\n  int my-cl-max-test (x, y, z) {\n  return MY_CL_MAX (x, y, z);\n  }\n  }#\n\n  (my-cl-max-test -1 9999 0) ; =\u003e 1\n#+end_src\n\n=#= (stringify) and =##= (concatenate) operator can be used, but\nonly in Level 2 syntax (because it conflicts with standard Lisp\n'#' syntax.)\n\n#+begin_src lisp\n  (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)\n\n  (string=\n   \"1.2\"\n   #2{\n   #define STR(x) #x\n   #define EXPAND_STR(x) STR(x) \n   #define CAT(x,y) x##y\n   EXPAND_STR(CAT(1,.2))\n   }#)\n#+end_src\n\n(Yes, you can use these transformation more freely in Lisp macro!)\n\n*** Conditional Inclusion\n\n=#if= family is supported. Simple example:\n\n#+begin_src lisp\n  (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)\n\n  #{\n  #define TEST_MACRO_DEFINITION\n\n  void * test-macro-defined-p (void) {\n  #ifdef TEST_MACRO_DEFINITION\n    return t;\n  #else\n    return nil;\n  #endif\n  }\n  }#\n\n  (test-macro-defined-p) ; =\u003e t\n#+end_src\n\n=#if= also works as expected. It can evaluate any Lisp expressions\nusing =`= syntax. This feature enables to use =*features*= by\n=#if= conditionals:\n\n#+begin_src lisp\n  (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)\n\n  (defun see-features-example ()\n    #{\n    #if `(member :sbcl *features* :test 'eq)\n    format(nil, \"I am SBCL: ~A\", lisp-implementation-version());\n    #elif `(member :allegro *features* :test 'eq)\n    format(nil, \"I am ALLEGRO: ~A\", lisp-implementation-version());\n    #else\n    \"Under implementation\";\n    #endif\n    }#)\n\n  (see-features-example)\n  ;; On SBCL\n  ;; =\u003e \"I am SBCL: 2.1.7\"\n  ;; On Allegro\n  ;; =\u003e \"I am ALLEGRO: 10.1 [64-bit Mac OS X (Intel) *SMP*] (Jul 6, 2018 18:44)\"\n  ;; On other implementations\n  ;; =\u003e \"Under implementation\"\n#+end_src\n\n*** =#include=\n\n=#include= works as you know:\n\n#+begin_src lisp\n  (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)\n\n  (with-open-file (stream \"/tmp/tmp.h\" :direction :output :if-exists :supersede)\n    (format stream \"const int foo = 100;\"))\n\n  (defun return-foo ()\n    #{\n    #include \"/tmp/tmp.h\"\n    return foo;\n    }#)\n\n  (return-foo) ; =\u003e 100\n#+end_src\n\nWhen using =#include=, it can be a problem which package the\nsymbol is interned in.  It can be changed with the with-c-syntax\nspecific pragma [fn:1].\n\n#+begin_src lisp\n  (named-readtables:in-readtable with-c-syntax:with-c-syntax-readtable)\n\n  (with-open-file (stream \"/tmp/tmp.h\" :direction :output :if-exists :supersede)\n    ;; _Pragma() can be embedded in the included file.\n    (format stream \"const int bar = 123;\"))\n\n  (defpackage temp-package\n    (:use :cl)\n    (:export #:bar))\n\n  #2{\n  _Pragma(\"WITH_C_SYNTAX IN_PACKAGE \\\"TEMP-PACKAGE\\\"\")\n  #include \"/tmp/tmp.h\"\n  }#\n\n  temp-package:bar ; =\u003e 123\n#+end_src\n\n(But in the Lisp world, you already have =read=, =eval=, and =load=...)\n\n* How to load\n\n** Loading by quicklisp\n\nThis library is quicklisp-ready on [[http://blog.quicklisp.org/2021/08/august-2021-quicklisp-dist-update-now.html][August 2021 dist]].\n\n#+BEGIN_SRC lisp\n(ql:quickload \"with-c-syntax\")\n#+END_SRC\n\n** or, Loading manually\n\n*** Libraries depending on\n- cl-yacc :: As a parser for C syntax.\n- alexandria :: Many utilities.\n- named-readtables :: For exporting '#{' reader syntax.\n- cl-ppcre :: For parsing numeric constants.\n- trivial-gray-streams :: For implementing translation phase 1 and 2 correctly.\n- asdf :: For using system-relative pathname, implementing =#include \u003c...\u003e=\n\n**** by libc\n- float-features :: For math.h, dealing NaN and Infinities.\n- floating-point-contractions :: For math.h, to implement some functions.\n\n**** by test codes\n- 1am :: As a testing framework.\n- trivial-cltl2 :: For using =compiler-let= to test =NDEBUG=.\n- floating-point :: For comparing mathmatical function results.\n\n*** Load with ASDF\n#+BEGIN_SRC lisp\n(asdf:load-asd \"with-c-syntax.asd\")\n(asdf:load-system :with-c-syntax)\n#+END_SRC\n\n*** Running tests\n#+BEGIN_SRC lisp\n(asdf:load-asd \"with-c-syntax-test.asd\")\n(asdf:test-system :with-c-syntax)\n#+END_SRC\n\n*** CI\n\n    [[https://github.com/y2q-actionman/with-c-syntax/actions/workflows/linux-sbcl-testSystem.yml/badge.svg]]\n    [[https://github.com/y2q-actionman/with-c-syntax/actions/workflows/linux-load.yml/badge.svg]]\n    [[https://github.com/y2q-actionman/with-c-syntax/actions/workflows/macos-load.yml/badge.svg]]\n    \n    There are Github Actions to run the test above.\n    I wrote current recipes referring the example of [[https://github.com/neil-lindquist/CI-Utils][CI-Utils]].\n\n* API\nPlease see these docstrings or comments:\n\n- Macro [[https://github.com/y2q-actionman/with-c-syntax/blob/95eebdc79eb8dc8c5c3e29d218e447b3ff2b949c/src/with-c-syntax.lisp#L15-L46][with-c-syntax]]\n- Comments around [[https://github.com/y2q-actionman/with-c-syntax/blob/95eebdc79eb8dc8c5c3e29d218e447b3ff2b949c/src/reader.lisp#L792-L820][with-c-syntax-readtable]]\n- Variable [[https://github.com/y2q-actionman/with-c-syntax/blob/95eebdc79eb8dc8c5c3e29d218e447b3ff2b949c/src/reader.lisp#L5-L100][*with-c-syntax-reader-level*]]\n- Variable [[https://github.com/y2q-actionman/with-c-syntax/blob/95eebdc79eb8dc8c5c3e29d218e447b3ff2b949c/src/reader.lisp#L102-L111][*with-c-syntax-reader-case*]]\n- Variable [[https://github.com/y2q-actionman/with-c-syntax/blob/95eebdc79eb8dc8c5c3e29d218e447b3ff2b949c/src/reader.lisp#L113-L115][*previous-readtable*]]\n- Variable [[https://github.com/y2q-actionman/with-c-syntax/blob/95eebdc79eb8dc8c5c3e29d218e447b3ff2b949c/src/preprocessor.lisp#L19-L23][*with-c-syntax-find-include-file-function-list*]]\n\n* Further Information\nWhat this macro does is only expanding a list of symbols to a Lisp form.\n\nIf you are still interested, please see:\nhttps://github.com/y2q-actionman/with-c-syntax/wiki\n\n[[https://github.com/vsedach/Vacietis][Vacietis]] is a similer project. It is a \"C to Common Lisp\" compiler,\nbased on reader macros.\n\n\"[[https://evilmartians.com/chronicles/a-no-go-fantasy-writing-go-in-ruby-with-ruby-next][A no-go fantasy: writing Go in Ruby with Ruby Next]]\" takes a similer approach in Ruby.\n\n* License\n\nCopyright (c) 2014,2019,2021 YOKOTA Yuki \u003cy2q-actionman@users.noreply.github.com\u003e\n\nThis program is free software. It comes without any warranty, to\nthe extent permitted by applicable law. You can redistribute it\nand/or modify it under the terms of the Do What The Fuck You Want\nTo Public License, Version 2, as published by Sam Hocevar. See\nthe COPYING file for more details.\n\n* Footnotes\n\n[fn:1] In this example, I used =_Pragma()= operator instead of '#pragma' notation because =#p= is\nalready used by the standard syntax. Level 2 syntax only supports\nthat. See =*with-c-syntax-reader-case*= docstring for reader levels.\n","funding_links":[],"categories":["Common Lisp","Expert Systems"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fy2q-actionman%2Fwith-c-syntax","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fy2q-actionman%2Fwith-c-syntax","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fy2q-actionman%2Fwith-c-syntax/lists"}