Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

I'm partial to

  select total from orders
myself. I really wish was as much progress on syntaxes for expressing relational algebra as there is for the functional stuff. Dealing with map and apply seems a bit fiddly and low-level for what should be a straightforward thing to express declaratively.


    (defmacro select [total _ coll]
      (let [total (keyword total)]
        `(map ~total ~coll)))

    (select total from orders)
Problem solved!


Nice.

Here are some interesting non-macro variants, first in Rebol:

  select: func [block] [
      totals: []
      parse block [
          set this word!
          'from
          set coll word!
          (totals: map-each n (get coll) [get in n this])
      ]
      totals
  ]
 
  ; then later...

  select [total from orders]

  ;; nb. `select` is a core function provided by Rebol
  ;;     so remember this example overwrites that
  ;;     (in this scope/context)  :)
  ;;
  ;;     Alternative `dialect` to strive for would be..
  ;;  
  ;;       doMap [select total from orders]

And also in Io:

  select := method(
      msg  := call argAt(0)
      this := msg name
      coll := msg next next name
  
      newMsg := message(COLL map)     // COLL just a placeholder message
      newMsg setName(coll)            // Now been changed to correct var provided
      newMsg next appendArg(this asMessage)
      call sender doMessage(newMsg)
  )

  # then later...

  select(total from orders)
Both examples work at runtime. However in Io you can also amend the AST directly.


There's a GHC (Haskell) extension which lets you use list comprehensions which read like SQL: http://www.haskell.org/ghc/docs/7.2.1/html/users_guide/synta...


I agree, but I think that `map` is already a declarative interface (albeit to an implementation that is presumably functional).




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: